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

Artifact c05cd62a7af20004414a425c0f798cf5db36ba9f:


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 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .h>.#endif../*.*
0260: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0270: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0280: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0290: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
02a0: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
02b0: 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 61 6e 64  ** Compiling and
02c0: 20 75 73 69 6e 67 20 57 41 4c 20 6d 6f 64 65 20   using WAL mode 
02d0: 72 65 71 75 69 72 65 73 20 73 65 76 65 72 61 6c  requires several
02e0: 20 41 50 49 73 20 74 68 61 74 20 61 72 65 20 6f   APIs that are o
02f0: 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  nly.** available
0300: 20 69 6e 20 57 69 6e 64 6f 77 73 20 70 6c 61 74   in Windows plat
0310: 66 6f 72 6d 73 20 62 61 73 65 64 20 6f 6e 20 74  forms based on t
0320: 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f  he NT kernel..*/
0330: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
0340: 57 49 4e 4e 54 20 26 26 20 21 64 65 66 69 6e 65  WINNT && !define
0350: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0360: 4c 29 0a 23 20 65 72 72 6f 72 20 22 57 41 4c 20  L).# error "WAL 
0370: 6d 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 75  mode requires su
0380: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 57  pport from the W
0390: 69 6e 64 6f 77 73 20 4e 54 20 6b 65 72 6e 65 6c  indows NT kernel
03a0: 2c 20 63 6f 6d 70 69 6c 65 5c 0a 20 77 69 74 68  , compile\. with
03b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
03c0: 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .".#endif../*.**
03d0: 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65   Are most of the
03e0: 20 57 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73   Win32 ANSI APIs
03f0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
0400: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
0410: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
0420: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
0430: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21  tform)?.*/.#if !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
0450: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
0460: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53 51  NRT.#  define SQ
0470: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0480: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0490: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
04a0: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
04b0: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
04c0: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
04d0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
04e0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
04f0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
0500: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
0510: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
0520: 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45 5f  WINNT || SQLITE_
0530: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
0540: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0550: 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66 0a  HAS_WIDE.#endif.
0560: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70  ./*.** Maximum p
0570: 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28  athname length (
0580: 69 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69  in chars) for Wi
0590: 6e 33 32 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  n32.  This shoul
05a0: 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a  d normally be.**
05b0: 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f 0a 23 69   MAX_PATH..*/.#i
05c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
05d0: 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  32_MAX_PATH_CHAR
05e0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
05f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0600: 48 5f 43 48 41 52 53 20 20 20 28 4d 41 58 5f 50  H_CHARS   (MAX_P
0610: 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ATH).#endif../*.
0620: 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e  ** Maximum pathn
0630: 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62  ame length (in b
0640: 79 74 65 73 29 20 66 6f 72 20 57 69 6e 33 32 2e  ytes) for Win32.
0650: 20 20 54 68 65 20 4d 41 58 5f 50 41 54 48 20 6d    The MAX_PATH m
0660: 61 63 72 6f 20 69 73 20 69 6e 0a 2a 2a 20 63 68  acro is in.** ch
0670: 61 72 61 63 74 65 72 73 2c 20 73 6f 20 77 65 20  aracters, so we 
0680: 61 6c 6c 6f 63 61 74 65 20 33 20 62 79 74 65 73  allocate 3 bytes
0690: 20 70 65 72 20 63 68 61 72 61 63 74 65 72 20 61   per character a
06a0: 73 73 75 6d 69 6e 67 20 77 6f 72 73 74 2d 63 61  ssuming worst-ca
06b0: 73 65 20 6f 66 0a 2a 2a 20 33 2d 62 79 74 65 73  se of.** 3-bytes
06c0: 2d 70 65 72 2d 63 68 61 72 61 63 74 65 72 20 66  -per-character f
06d0: 6f 72 20 55 54 46 38 2e 0a 2a 2f 0a 23 69 66 6e  or UTF8..*/.#ifn
06e0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
06f0: 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 0a  _MAX_PATH_BYTES.
0700: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0710: 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
0720: 42 59 54 45 53 20 20 20 28 53 51 4c 49 54 45 5f  BYTES   (SQLITE_
0730: 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43  WIN32_MAX_PATH_C
0740: 48 41 52 53 2a 33 29 0a 23 65 6e 64 69 66 0a 0a  HARS*3).#endif..
0750: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 65 72  /*.** Maximum er
0760: 72 6f 72 20 6d 65 73 73 61 67 65 20 6c 65 6e 67  ror message leng
0770: 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f  th (in chars) fo
0780: 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23 69 66 6e  r WinRT..*/.#ifn
0790: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
07a0: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
07b0: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
07c0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
07d0: 4d 53 47 5f 43 48 41 52 53 20 28 31 30 32 34 29  MSG_CHARS (1024)
07e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
07f0: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e  o we need to man
0800: 75 61 6c 6c 79 20 64 65 66 69 6e 65 20 74 68 65  ually define the
0810: 20 57 69 6e 33 32 20 66 69 6c 65 20 6d 61 70 70   Win32 file mapp
0820: 69 6e 67 20 41 50 49 73 20 66 6f 72 20 75 73 65  ing APIs for use
0830: 20 77 69 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64   with WAL.** mod
0840: 65 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50  e (e.g. these AP
0850: 49 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  Is are available
0860: 20 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 20   in the Windows 
0870: 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c  CE SDK; however,
0880: 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74   they.** are not
0890: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
08a0: 68 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f  header file)?.*/
08b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  .#if SQLITE_WIN3
08c0: 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50  2_FILEMAPPING_AP
08d0: 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  I && !defined(SQ
08e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f  LITE_OMIT_WAL)./
08f0: 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74 68 65 20  *.** Two of the 
0900: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
0910: 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  s are different 
0920: 75 6e 64 65 72 20 57 69 6e 52 54 2e 20 20 46 69  under WinRT.  Fi
0930: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 0a 2a  gure out which.*
0940: 2a 20 73 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a  * set we need..*
0950: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
0960: 57 49 4e 52 54 0a 57 49 4e 42 41 53 45 41 50 49  WINRT.WINBASEAPI
0970: 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43   HANDLE WINAPI C
0980: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
0990: 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20  FromApp(HANDLE, 
09a0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
09b0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
09c0: 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c   ULONG, ULONG64,
09d0: 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42   LPCWSTR);..WINB
09e0: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
09f0: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0a00: 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45  leFromApp(HANDLE
0a10: 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34  , ULONG, ULONG64
0a20: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65  , SIZE_T);.#else
0a30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0a40: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0a50: 53 49 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48  SI).WINBASEAPI H
0a60: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
0a70: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
0a80: 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49  HANDLE, LPSECURI
0a90: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
0aa0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20  .        DWORD, 
0ab0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50  DWORD, DWORD, LP
0ac0: 43 53 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  CSTR);.#endif /*
0ad0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0ae0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
0af0: 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
0b00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
0b10: 5f 57 49 44 45 29 0a 57 49 4e 42 41 53 45 41 50  _WIDE).WINBASEAP
0b20: 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20  I HANDLE WINAPI 
0b30: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
0b40: 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43  gW(HANDLE, LPSEC
0b50: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
0b60: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
0b70: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
0b80: 20 4c 50 43 57 53 54 52 29 3b 0a 23 65 6e 64 69   LPCWSTR);.#endi
0b90: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
0ba0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0bb0: 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41  DE) */..WINBASEA
0bc0: 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41 50 49  PI LPVOID WINAPI
0bd0: 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 48   MapViewOfFile(H
0be0: 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57  ANDLE, DWORD, DW
0bf0: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45  ORD, DWORD, SIZE
0c00: 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _T);.#endif /* S
0c10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a  QLITE_OS_WINRT *
0c20: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69  /../*.** This fi
0c30: 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 20 69  le mapping API i
0c40: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68  s common to both
0c50: 20 57 69 6e 33 32 20 61 6e 64 20 57 69 6e 52 54   Win32 and WinRT
0c60: 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41 50 49 20  ..*/.WINBASEAPI 
0c70: 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61  BOOL WINAPI Unma
0c80: 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50 43 56  pViewOfFile(LPCV
0c90: 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  OID);.#endif /* 
0ca0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c  SQLITE_WIN32_FIL
0cb0: 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20  EMAPPING_API && 
0cc0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0cd0: 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a  OMIT_WAL) */../*
0ce0: 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f  .** Some Microso
0cf0: 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63  ft compilers lac
0d00: 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f  k this definitio
0d10: 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e  n..*/.#ifndef IN
0d20: 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
0d30: 42 55 54 45 53 0a 23 20 64 65 66 69 6e 65 20 49  BUTES.# define I
0d40: 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
0d50: 49 42 55 54 45 53 20 28 28 44 57 4f 52 44 29 2d  IBUTES ((DWORD)-
0d60: 31 29 20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  1) .#endif..#ifn
0d70: 64 65 66 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  def FILE_FLAG_MA
0d80: 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45  SK.# define FILE
0d90: 5f 46 4c 41 47 5f 4d 41 53 4b 20 20 20 20 20 20  _FLAG_MASK      
0da0: 20 20 20 20 28 30 78 46 46 33 43 30 30 30 30 29      (0xFF3C0000)
0db0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
0dc0: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
0dd0: 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20 46 49  MASK.# define FI
0de0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
0df0: 4b 20 20 20 20 20 28 30 78 30 30 30 33 46 46 46  K     (0x0003FFF
0e00: 37 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  7).#endif..#ifnd
0e10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
0e20: 41 4c 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  AL./* Forward re
0e30: 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70 65  ferences */.type
0e40: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
0e50: 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20  m winShm;       
0e60: 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74      /* A connect
0e70: 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
0e80: 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20  mory */.typedef 
0e90: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
0ea0: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20  e winShmNode;   
0eb0: 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73  /* A region of s
0ec0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
0ed0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69  #endif../*.** Wi
0ee0: 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65  nCE lacks native
0ef0: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c   support for fil
0f00: 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20  e locking so we 
0f10: 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a  have to fake it.
0f20: 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64  ** with some cod
0f30: 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f  e of our own..*/
0f40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
0f50: 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72  INCE.typedef str
0f60: 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a  uct winceLock {.
0f70: 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20    int nReaders; 
0f80: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
0f90: 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20  of reader locks 
0fa0: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f  obtained */.  BO
0fb0: 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20  OL bPending;    
0fc0: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61    /* Indicates a
0fd0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
0fe0: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
0ff0: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72  */.  BOOL bReser
1000: 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69  ved;     /* Indi
1010: 63 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64  cates a reserved
1020: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
1030: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1040: 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20  L bExclusive;   
1050: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e   /* Indicates an
1060: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1070: 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
1080: 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b  d */.} winceLock
1090: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
10a0: 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75  The winFile stru
10b0: 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c  cture is a subcl
10c0: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
10d0: 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f  ile* specific to
10e0: 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f   the win32.** po
10f0: 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e  rtability layer.
1100: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1110: 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69  ct winFile winFi
1120: 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69  le;.struct winFi
1130: 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  le {.  const sql
1140: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1150: 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d  *pMethod; /*** M
1160: 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a  ust be first ***
1170: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1180: 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54  *pVfs;      /* T
1190: 68 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f  he VFS used to o
11a0: 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  pen this file */
11b0: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20  .  HANDLE h;    
11c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
11d0: 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69  ndle for accessi
11e0: 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  ng the file */. 
11f0: 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20   u8 locktype;   
1200: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
1210: 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74   of lock current
1220: 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ly held on this 
1230: 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20  file */.  short 
1240: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20  sharedLockByte; 
1250: 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68    /* Randomly ch
1260: 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61  osen byte used a
1270: 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
1280: 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67  */.  u8 ctrlFlag
1290: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
12a0: 46 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46  Flags.  See WINF
12b0: 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20  ILE_* below */. 
12c0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
12e0: 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72  Windows errno fr
12f0: 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20  om the last I/O 
1300: 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66  error */.#ifndef
1310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1320: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b  .  winShm *pShm;
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1340: 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64  stance of shared
1350: 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20   memory on this 
1360: 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
1370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1380: 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  th;      /* Full
1390: 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69   pathname of thi
13a0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
13b0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
13c0: 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a      /* Chunk siz
13d0: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  e configured by 
13e0: 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
13f0: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
1400: 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52  S_WINCE.  LPWSTR
1410: 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b   zDeleteOnClose;
1420: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
1430: 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e  e to delete when
1440: 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41   closing */.  HA
1450: 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20  NDLE hMutex;    
1460: 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75        /* Mutex u
1470: 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  sed to control a
1480: 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20  ccess to shared 
1490: 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e 44  lock */  .  HAND
14a0: 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20 20  LE hShared;     
14b0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65      /* Shared me
14c0: 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65  mory segment use
14d0: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f  d for locking */
14e0: 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63  .  winceLock loc
14f0: 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  al;        /* Lo
1500: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  cks obtained by 
1510: 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66  this instance of
1520: 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69   winFile */.  wi
1530: 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b  nceLock *shared;
1540: 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20        /* Global 
1550: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f  shared lock memo
1560: 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  ry for the file 
1570: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1590: 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74  IZE>0.  int nFet
15a0: 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  chOut;          
15b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15c0: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
15d0: 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
15e0: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61   */.  HANDLE hMa
15f0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1600: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
1610: 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f  r accessing memo
1620: 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ry mapping */.  
1630: 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e  void *pMapRegion
1640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1650: 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70   Area memory map
1660: 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ped */.  sqlite3
1670: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b  _int64 mmapSize;
1680: 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65         /* Usable
1690: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
16a0: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
16b0: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
16c0: 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74  zeActual; /* Act
16d0: 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ual size of mapp
16e0: 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  ed region */.  s
16f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1700: 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20  pSizeMax;    /* 
1710: 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c  Configured FCNTL
1720: 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65  _MMAP_SIZE value
1730: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1740: 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  *.** Allowed val
1750: 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e  ues for winFile.
1760: 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65  ctrlFlags.*/.#de
1770: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f  fine WINFILE_RDO
1780: 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30  NLY          0x0
1790: 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f  2   /* Connectio
17a0: 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a  n is read only *
17b0: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
17c0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20  E_PERSIST_WAL   
17d0: 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73    0x04   /* Pers
17e0: 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20  istent WAL mode 
17f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1800: 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20  LE_PSOW         
1810: 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c     0x10   /* SQL
1820: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1830: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
1840: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65  ../*. * The size
1850: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75   of the buffer u
1860: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  sed by sqlite3_w
1870: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
1880: 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ().. */.#ifndef 
1890: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
18a0: 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66  _BUF_SIZE.#  def
18b0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
18c0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20  _DBG_BUF_SIZE   
18d0: 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65  ((int)(4096-size
18e0: 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64  of(DWORD))).#end
18f0: 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61  if../*. * The va
1900: 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71  lue used with sq
1910: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
1920: 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73  directory() to s
1930: 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74  pecify that. * t
1940: 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
1950: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
1960: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
1970: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41   SQLITE_WIN32_DA
1980: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
1990: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
19a0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
19b0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29  RECTORY_TYPE (1)
19c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
19d0: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69  he value used wi
19e0: 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  th sqlite3_win32
19f0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29  _set_directory()
1a00: 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74   to specify that
1a10: 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72  . * the temporar
1a20: 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  y directory shou
1a30: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
1a40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1a50: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
1a60: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
1a70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
1a80: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
1a90: 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69  Y_TYPE (2).#endi
1aa0: 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70  f../*. * If comp
1ab0: 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
1ac0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e  _WIN32_MALLOC on
1ad0: 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c   Windows, we wil
1ae0: 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72  l use the. * var
1af0: 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68  ious Win32 API h
1b00: 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  eap functions in
1b10: 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e  stead of our own
1b20: 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .. */.#ifdef SQL
1b30: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
1b40: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20  ../*. * If this 
1b50: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20  is non-zero, an 
1b60: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
1b70: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79  ll be created by
1b80: 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33   the native Win3
1b90: 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73  2. * allocator s
1ba0: 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77  ubsystem; otherw
1bb0: 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74  ise, the default
1bc0: 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69   process heap wi
1bd0: 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69  ll be used.  Thi
1be0: 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73  s. * setting has
1bf0: 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20   no effect when 
1c00: 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69  compiling for Wi
1c10: 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74  nRT.  By default
1c20: 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65  , this is enable
1c30: 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c  d. * and an isol
1c40: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62  ated heap will b
1c50: 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f  e created to sto
1c60: 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64  re all allocated
1c70: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a   data.. *. *****
1c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52  *********. * WAR
1cd0: 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f  NING: It is impo
1ce0: 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68  rtant to note th
1cf0: 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74  at when this set
1d00: 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ting is non-zero
1d10: 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20   and the. *     
1d20: 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64       winMemShutd
1d30: 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  own function is 
1d40: 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20  called (e.g. by 
1d50: 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74  the sqlite3_shut
1d60: 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20  down. *         
1d70: 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20   function), all 
1d80: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c  data that was al
1d90: 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68  located using th
1da0: 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  e isolated heap 
1db0: 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20  will. *         
1dc0: 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69   be freed immedi
1dd0: 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74  ately and any at
1de0: 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20  tempt to access 
1df0: 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65  any of that free
1e00: 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61  d. *          da
1e10: 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63  ta will almost c
1e20: 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20  ertainly result 
1e30: 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  in an immediate 
1e40: 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e  access violation
1e50: 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *************
1e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea0: 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  *. */.#ifndef SQ
1eb0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
1ec0: 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65  CREATE.#  define
1ed0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1ee0: 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52  AP_CREATE    (TR
1ef0: 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  UE).#endif../*. 
1f00: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69  * The initial si
1f10: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
1f20: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
1f30: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
1f40: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
1f50: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1f60: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a  _HEAP_INIT_SIZE.
1f70: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1f80: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
1f90: 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44  _SIZE ((SQLITE_D
1fa0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
1fb0: 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20  E) * \.         
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
1fe0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1ff0: 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33  GE_SIZE) + 41943
2000: 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  04).#endif../*. 
2010: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  * The maximum si
2020: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
2030: 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20  specific heap.  
2040: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
2050: 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e  e zero.. */.#ifn
2060: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2070: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23  _HEAP_MAX_SIZE.#
2080: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2090: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
20a0: 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a  IZE  (0).#endif.
20b0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61  ./*. * The extra
20c0: 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e   flags to use in
20d0: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69   calls to the Wi
20e0: 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20  n32 heap APIs.  
20f0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
2100: 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68  e. * zero for th
2110: 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
2120: 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  or.. */.#ifndef 
2130: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2140: 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e  P_FLAGS.#  defin
2150: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2160: 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30  EAP_FLAGS     (0
2170: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  ).#endif.../*.**
2180: 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20   The winMemData 
2190: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
21a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71   information req
21b0: 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e  uired by the Win
21c0: 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73  32-specific.** s
21d0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
21e0: 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ds implementatio
21f0: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
2200: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
2210: 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75  winMemData;.stru
2220: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a  ct winMemData {.
2230: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2240: 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f   u32 magic;    /
2250: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
2260: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
2270: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
2280: 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c  /.#endif.  HANDL
2290: 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20  E hHeap; /* The 
22a0: 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65  handle to our he
22b0: 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f  ap. */.  BOOL bO
22c0: 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20  wned;  /* Do we 
22d0: 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e  own the heap (i.
22e0: 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e  e. destroy it on
22f0: 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d   shutdown)? */.}
2300: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
2310: 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  G.#define WINMEM
2320: 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32 62  _MAGIC     0x42b
2330: 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74  2830b.#endif..st
2340: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
2350: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
2360: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
2370: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
2380: 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20  MAGIC,.#endif.  
2390: 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a  NULL, FALSE.};..
23a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
23b0: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
23c0: 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65 72  ertMagic() asser
23d0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
23e0: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
23f0: 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66  GIC ).#else.#def
2400: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
2410: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
2420: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2430: 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f  tHeap() win_mem_
2440: 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74  data.hHeap..stat
2450: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
2460: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
2470: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
2480: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
2490: 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20  pPrior);.static 
24a0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
24b0: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
24c0: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  , int nBytes);.s
24d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
24e0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73  Size(void *p);.s
24f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
2500: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a  Roundup(int n);.
2510: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
2520: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
2530: 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f  Data);.static vo
2540: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
2550: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
2560: 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  );..const sqlite
2570: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
2580: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
2590: 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20  2(void);.#endif 
25a0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
25b0: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
25c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
25d0: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
25e0: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
25f0: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
2600: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
2610: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
2620: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
2630: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
2640: 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  x.** or WinNT..*
2650: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
2660: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
2670: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
2680: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
2690: 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win9x..** 2:   O
26a0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
26b0: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
26c0: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
26d0: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
26e0: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
26f0: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
2700: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
2710: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
2720: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
2730: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
2740: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2750: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
2760: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
2770: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
2780: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2790: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
27a0: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
27b0: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
27c0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
27d0: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
27e0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
27f0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
2800: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
2810: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
2820: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2830: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
2840: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
2850: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
2860: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
2870: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
2880: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2890: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
28a0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
28b0: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
28c0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
28d0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
28e0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
28f0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
2900: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
2910: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
2920: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2930: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2940: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2950: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2960: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2970: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2980: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
2990: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
29a0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
29b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
29c0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
29d0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
29e0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
29f0: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
2a00: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
2a10: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
2a20: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2a30: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
2a40: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
2a50: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
2a60: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
2a70: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
2a80: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
2a90: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
2aa0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
2ab0: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
2ac0: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
2ad0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
2ae0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
2af0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2b00: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2b10: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2b20: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
2b30: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
2b40: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
2b50: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
2b60: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
2b70: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
2b80: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
2b90: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2ba0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
2bb0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2bc0: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
2bd0: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
2be0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
2bf0: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
2c00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
2c10: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
2c20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
2c30: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2c60: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
2c70: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
2c80: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
2c90: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
2ca0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
2cb0: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
2cc0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2cd0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
2ce0: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
2cf0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2d00: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
2d10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2d20: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
2d30: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
2d40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2d70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
2d80: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
2d90: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
2da0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
2db0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
2dc0: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
2dd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2de0: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
2df0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2e00: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
2e10: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
2e20: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
2e30: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
2e40: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2e50: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2e60: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
2e70: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
2e80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2e90: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
2ea0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2eb0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
2ec0: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
2ed0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2f00: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
2f10: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
2f20: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
2f30: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
2f40: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
2f50: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
2f60: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
2f70: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
2f80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
2f90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2fa0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2fb0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2fc0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2fd0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2fe0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
2ff0: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
3000: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3010: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3030: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3050: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3060: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
3070: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3080: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
3090: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
30a0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
30b0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
30c0: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
30d0: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
30e0: 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f  )..#if (!SQLITE_
30f0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3100: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3110: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
3120: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
3130: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
3140: 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )).  { "CreateFi
3150: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
3160: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
3170: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20  eFileMappingA,  
3180: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3190: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
31a0: 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  ppingA",      (S
31b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
31e0: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
31f0: 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44  eMappingA ((HAND
3200: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
3210: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
3220: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
3230: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
3240: 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53  DWORD,LPCSTR))aS
3250: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
3260: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3270: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
3280: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3290: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
32a0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
32b0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
32c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
32d0: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
32e0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
32f0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3300: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3310: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
3320: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3330: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
3340: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3370: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3380: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28  teFileMappingW (
3390: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
33a0: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
33b0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
33c0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
33d0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53  WORD,DWORD,LPCWS
33e0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  TR))aSyscall[7].
33f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3400: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3410: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3420: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3430: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  ).  { "CreateMut
3440: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
3450: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3460: 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20  MutexW,         
3470: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3480: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
3490: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
34a0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
34c0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
34d0: 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65  ine osCreateMute
34e0: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
34f0: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
3500: 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c  ATTRIBUTES,BOOL,
3510: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53   \.        LPCWS
3520: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
3530: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3540: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3550: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3560: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3580: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
3590: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
35a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
35b0: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
35c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
35d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
35e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
35f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3600: 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28  osDeleteFileA ((
3610: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
3620: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39  CSTR))aSyscall[9
3630: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3640: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3650: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3660: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
3670: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3680: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
3690: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
36a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
36b0: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
36c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
36d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
36f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3700: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20  e osDeleteFileW 
3710: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3720: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3730: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
3740: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3750: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
3760: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
3770: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c  e", (SYSCALL)Fil
3780: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
3790: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
37a0: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
37b0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
37c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
37f0: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
3800: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
3810: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
3820: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
3830: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
3840: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
3850: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
3860: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3870: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
3880: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
3890: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65     (SYSCALL)File
38a0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
38b0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
38c0: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
38d0: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
38e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3910: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
3920: 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42  ToSystemTime ((B
3930: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
3940: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
3950: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
3960: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
3970: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3980: 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66  { "FlushFileBuff
3990: 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59  ers",        (SY
39a0: 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42  SCALL)FlushFileB
39b0: 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30  uffers,        0
39c0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
39d0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20  lushFileBuffers 
39e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
39f0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3a00: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
3a10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3a20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3a30: 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  I).  { "FormatMe
3a40: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
3a50: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
3a60: 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20  tMessageA,      
3a70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3a80: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
3a90: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
3aa0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3ad0: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
3ae0: 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49  sageA ((DWORD(WI
3af0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
3b00: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
3b10: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
3b20: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
3b30: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
3b40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3b50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3b60: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3b70: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
3b80: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
3b90: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
3ba0: 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  geW,          0 
3bb0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
3bc0: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
3bd0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3be0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3bf0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c00: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3c10: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20  sFormatMessageW 
3c20: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3c30: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
3c40: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WORD,DWORD,LPWST
3c50: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
3c60: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
3c70: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
3c80: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3c90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
3ca0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
3cb0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3cd0: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
3ce0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
3cf0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
3d00: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
3d10: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3d20: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3d30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3d40: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3d50: 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28  osFreeLibrary ((
3d60: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d  BOOL(WINAPI*)(HM
3d70: 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ODULE))aSyscall[
3d80: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3d90: 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72   { "GetCurrentPr
3da0: 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53  ocessId",     (S
3db0: 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e  YSCALL)GetCurren
3dc0: 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20  tProcessId,     
3dd0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
3de0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
3df0: 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41  sId ((DWORD(WINA
3e00: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
3e10: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
3e20: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3e30: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3e40: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3e50: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
3e60: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
3e70: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
3e80: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
3e90: 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceA,       0 },.
3ea0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
3eb0: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
3ec0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ef0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3f00: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20  tDiskFreeSpaceA 
3f10: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3f20: 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  LPCSTR,LPDWORD,L
3f30: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
3f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
3f50: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  D))aSyscall[18].
3f60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3f70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
3f80: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
3f90: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3fa0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3fb0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69  WIDE).  { "GetDi
3fc0: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
3fd0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3fe0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c  tDiskFreeSpaceW,
3ff0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4000: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
4010: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
4020: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4050: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
4060: 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f  kFreeSpaceW ((BO
4070: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
4080: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
4090: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
40a0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
40b0: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
40c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
40d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
40e0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
40f0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4100: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4110: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4120: 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c  utesA,      0 },
4130: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4140: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
4150: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4170: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4180: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4190: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
41a0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
41b0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
41c0: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
41d0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
41e0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
41f0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4200: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4210: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4220: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4230: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4240: 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesW,      0 },.
4250: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4260: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
4270: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
42a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
42b0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
42c0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
42d0: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
42e0: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
42f0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4300: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4310: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
4320: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4330: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65  ,    (SYSCALL)Ge
4340: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4350: 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  xW,    0 },.#els
4360: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
4370: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
4380: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
43b0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
43c0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28  eAttributesExW (
43d0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
43e0: 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45  PCWSTR,GET_FILEE
43f0: 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c  X_INFO_LEVELS, \
4400: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
4410: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
4420: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4430: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4440: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4460: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
4470: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
4480: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4490: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
44a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
44b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
44c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
44d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
44e0: 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28  osGetFileSize ((
44f0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
4500: 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61  ANDLE,LPDWORD))a
4510: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
4520: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4530: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4540: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4550: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4560: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
4570: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
4580: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
4590: 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30  hNameA,        0
45a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
45b0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
45c0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
45d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
45e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
45f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4600: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
4610: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
4620: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
4630: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
4640: 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61    LPSTR*))aSysca
4650: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
4660: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4670: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
4680: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
4690: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
46a0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
46b0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
46c0: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
46d0: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
46e0: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
46f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4700: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
4710: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4720: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4730: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4740: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4750: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
4760: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4770: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
4780: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
4790: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
47a0: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
47b0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
47c0: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
47d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
47e0: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
47f0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4800: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
4810: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
4820: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
4830: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
4840: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4850: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
4860: 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51  XTENSION).#if SQ
4870: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4880: 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64  /* The GetProcAd
4890: 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65  dressA() routine
48a0: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
48b0: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
48c0: 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  . */.  { "GetPro
48d0: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
48e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
48f0: 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20  ProcAddressA,   
4900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4910: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
4920: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
4930: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
4940: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
4950: 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73  e.  ** an ANSI s
4960: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
4970: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
4980: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20   setting */.  { 
4990: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
49a0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
49b0: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
49c0: 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ss,          0 }
49d0: 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20  ,.#endif.#else. 
49e0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
49f0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
4a00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4a30: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64  fine osGetProcAd
4a40: 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43  dressA ((FARPROC
4a50: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
4a60: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  E, \.        LPC
4a70: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  STR))aSyscall[27
4a80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4a90: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4aa0: 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  T.  { "GetSystem
4ab0: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
4ac0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
4ad0: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  temInfo,        
4ae0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4af0: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
4b00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4b10: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4b30: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4b40: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
4b50: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
4b60: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
4b70: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
4b80: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4b90: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
4ba0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4bb0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
4bc0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
4bd0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
4be0: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
4bf0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
4c00: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
4c10: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
4c20: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4c30: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
4c40: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
4c50: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
4c60: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
4c70: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
4c80: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
4c90: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
4ca0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4cd0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
4ce0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
4cf0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
4d00: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
4d10: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
4d20: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
4d30: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4d40: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4d50: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
4d60: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
4d70: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
4d80: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
4d90: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4da0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
4db0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4dc0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4df0: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
4e00: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
4e10: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
4e20: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
4e30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4e40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4e50: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4e60: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4e70: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
4e80: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
4e90: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
4ea0: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
4eb0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4ec0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4ee0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4f00: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4f10: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
4f20: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4f30: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
4f40: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
4f50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4f60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4f70: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
4f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4f90: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
4fa0: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
4fb0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4fc0: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
4fd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4fe0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4ff0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5000: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5010: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
5020: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5030: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
5040: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
5050: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5060: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5070: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
5080: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
5090: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
50a0: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
50b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
50c0: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
50d0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
50e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5100: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5110: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
5120: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
5130: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
5140: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
5150: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
5160: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
5170: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
5180: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5190: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
51a0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
51b0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
51c0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
51d0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
51e0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
51f0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35  E_T))aSyscall[35
5200: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5210: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5220: 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  T.  { "HeapCreat
5230: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5240: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72   (SYSCALL)HeapCr
5250: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
5260: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5270: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5290: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
52b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
52c0: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
52d0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
52e0: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
52f0: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
5300: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e  T))aSyscall[36].
5310: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5320: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5330: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
5340: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
5350: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
5360: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
5370: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5380: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
5390: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
53a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
53c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
53d0: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
53e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
53f0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
5400: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [37].pCurrent)..
5410: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5430: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
5440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5450: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5460: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
5470: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5480: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
5490: 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72  Syscall[38].pCur
54a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
54b0: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
54c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
54d0: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
54e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
54f0: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
5500: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
5510: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5520: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
5530: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
5540: 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65  scall[39].pCurre
5550: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
5560: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
5570: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5580: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
5590: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
55a0: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
55b0: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
55c0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
55d0: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
55e0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
55f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5600: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5610: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
5620: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5630: 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64  YSCALL)HeapValid
5640: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
5650: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5660: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
5670: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5680: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5690: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
56a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
56b0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
56c0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
56d0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
56e0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
56f0: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43  )aSyscall[41].pC
5700: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5710: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5720: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21  2_HAS_ANSI) && !
5730: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5740: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
5750: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  ON).  { "LoadLib
5760: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
5770: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
5780: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20  LibraryA,       
5790: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
57a0: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
57b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
57c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
57f0: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
5800: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryA ((HMODULE(W
5810: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
5820: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75  aSyscall[42].pCu
5830: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5840: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
5850: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5860: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
5870: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
5880: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5890: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
58a0: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
58b0: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
58c0: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
58d0: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20  raryW,          
58e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
58f0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
5900: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5910: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5930: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5940: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
5950: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  W ((HMODULE(WINA
5960: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
5970: 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72  yscall[43].pCurr
5980: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5990: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
59a0: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
59b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
59c0: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20  LL)LocalFree,   
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
59e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61  .#else.  { "Loca
59f0: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
5a00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5a10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5a20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5a30: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
5a40: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41  ocalFree ((HLOCA
5a50: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41  L(WINAPI*)(HLOCA
5a60: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e  L))aSyscall[44].
5a70: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5a80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5a90: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
5aa0: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NRT.  { "LockFil
5ab0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5ac0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
5ad0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
5ae0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5af0: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5b10: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
5b40: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65  fndef osLockFile
5b50: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
5b60: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5b70: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5b80: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
5b90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
5ba0: 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72  Syscall[45].pCur
5bb0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
5bc0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5bd0: 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  CE.  { "LockFile
5be0: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
5bf0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
5c00: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
5c10: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5c20: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5c40: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c60: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5c70: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  ndef osLockFileE
5c80: 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b  x.#define osLock
5c90: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
5ca0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5cb0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5cc0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5cd0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
5ce0: 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72  Syscall[46].pCur
5cf0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
5d00: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
5d10: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
5d20: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
5d30: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
5d40: 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  AL)).  { "MapVie
5d50: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
5d60: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
5d70: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
5d80: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5d90: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
5da0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5db0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5de0: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
5df0: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
5e00: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5e10: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
5e20: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
5e30: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  E_T))aSyscall[47
5e40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5e50: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
5e60: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
5e70: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
5e80: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
5e90: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
5ea0: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
5eb0: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
5ec0: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
5ed0: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
5ee0: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
5ef0: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
5f00: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
5f10: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
5f20: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
5f30: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
5f40: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
5f50: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
5f60: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
5f70: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5f80: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
5f90: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
5fa0: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
5fb0: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
5fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fd0: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
5fe0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
5ff0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6000: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
6010: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6020: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
6030: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
6040: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
6050: 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43  )aSyscall[50].pC
6060: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
6070: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
6080: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6090: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
60a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
60b0: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
60c0: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
60d0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
60e0: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
60f0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6100: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6110: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
6120: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
6130: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6140: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  er,          0 }
6150: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6160: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
6170: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6180: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6190: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61a0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
61b0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28  SetFilePointer (
61c0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
61d0: 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e  HANDLE,LONG,PLON
61e0: 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  G, \.        DWO
61f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d  RD))aSyscall[52]
6200: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6210: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6220: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20  (SYSCALL)Sleep, 
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6270: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
6280: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6290: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
62b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
62c0: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
62d0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
62e0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
62f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
6300: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
6310: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
6320: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
6330: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
6340: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
6350: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
6360: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6370: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
6380: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
6390: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
63a0: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
63b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
63c0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
63d0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55  _OS_WINRT.  { "U
63e0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
63f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6400: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20  L)UnlockFile,   
6410: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6420: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
6430: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6440: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6470: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e  if..#ifndef osUn
6480: 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  lockFile.#define
6490: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
64a0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
64b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
64c0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
64d0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
64e0: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
64f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
6500: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
6510: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
6520: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6530: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
6540: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
6550: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
6560: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
6570: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6580: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6590: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
65a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
65b0: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28  sUnlockFileEx ((
65c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
65d0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
65e0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
65f0: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
6600: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
6610: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
6620: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21  TE_OS_WINCE || !
6630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6640: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e  MIT_WAL).  { "Un
6650: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
6660: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6670: 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  )UnmapViewOfFile
6680: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
6690: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56  else.  { "UnmapV
66a0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
66b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
66e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d  f..#define osUnm
66f0: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42  apViewOfFile ((B
6700: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
6710: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  VOID))aSyscall[5
6720: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
6730: 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  { "WideCharToMul
6740: 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59  tiByte",     (SY
6750: 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f  SCALL)WideCharTo
6760: 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30  MultiByte,     0
6770: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
6780: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
6790: 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  te ((int(WINAPI*
67a0: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
67b0: 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69  WSTR,int,LPSTR,i
67c0: 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  nt, \.        LP
67d0: 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79  CSTR,LPBOOL))aSy
67e0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
67f0: 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46  nt)..  { "WriteF
6800: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6810: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69      (SYSCALL)Wri
6820: 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  teFile,         
6830: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6840: 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20  ine osWriteFile 
6850: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6860: 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44  HANDLE,LPCVOID,D
6870: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
6880: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6890: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
68a0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
68b0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
68c0: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  T.  { "CreateEve
68d0: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
68e0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
68f0: 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20  EventExW,       
6900: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6910: 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78  { "CreateEventEx
6920: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
6930: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6950: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6960: 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e  ine osCreateEven
6970: 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  tExW ((HANDLE(WI
6980: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
6990: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43  Y_ATTRIBUTES,LPC
69a0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
69b0: 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79  DWORD,DWORD))aSy
69c0: 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65  scall[60].pCurre
69d0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
69e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57  _OS_WINRT.  { "W
69f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6a00: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
6a10: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
6a20: 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a  bject,     0 },.
6a30: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
6a40: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c  orSingleObject",
6a50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6a80: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
6a90: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
6aa0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
6ab0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
6ac0: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
6ad0: 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e  call[61].pCurren
6ae0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
6af0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
6b00: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
6b10: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
6b20: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
6b30: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
6b40: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
6b50: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
6b60: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6b90: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
6ba0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
6bb0: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
6bc0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6bd0: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
6be0: 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43  )aSyscall[62].pC
6bf0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
6c00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6c10: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
6c20: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
6c30: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
6c40: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
6c50: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
6c60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
6c70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6c80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6c90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6ca0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6cb0: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
6cc0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
6cd0: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
6ce0: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
6cf0: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
6d00: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
6d10: 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [63].pCurrent)..
6d20: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6d30: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
6d40: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
6d50: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
6d60: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
6d70: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
6d80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
6d90: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
6da0: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
6db0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6dc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6dd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6de0: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
6df0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
6e00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6e10: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
6e20: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
6e30: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
6e40: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
6e50: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
6e60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6e70: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
6e80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
6e90: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
6ea0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
6eb0: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
6ec0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20  wOfFileFromApp, 
6ed0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6ee0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
6ef0: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
6f00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6f20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6f30: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
6f40: 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56  ileFromApp ((LPV
6f50: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6f60: 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  DLE,ULONG,ULONG6
6f70: 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  4, \.        SIZ
6f80: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 35  E_T))aSyscall[65
6f90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6fa0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6fb0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
6fc0: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
6fd0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
6fe0: 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20  ile2,           
6ff0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7000: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
7010: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7020: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7040: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7050: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32  ne osCreateFile2
7060: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7070: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
7080: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
7090: 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45          LPCREATE
70a0: 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
70b0: 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63  ARAMETERS))aSysc
70c0: 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74  all[66].pCurrent
70d0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
70e0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
70f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
7100: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
7110: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
7120: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
7130: 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61  YSCALL)LoadPacka
7140: 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20  gedLibrary,     
7150: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7160: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
7170: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
7180: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7190: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
71a0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
71b0: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
71c0: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45  ibrary ((HMODULE
71d0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
71e0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
71f0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d  RD))aSyscall[67]
7200: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7210: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7220: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
7230: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
7240: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43  SYSCALL)GetTickC
7250: 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20  ount64,         
7260: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7270: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
7280: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7290: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
72b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
72c0: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
72d0: 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57  64 ((ULONGLONG(W
72e0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
72f0: 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72  yscall[68].pCurr
7300: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7310: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
7320: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
7330: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
7340: 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  L)GetNativeSyste
7350: 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a  mInfo,     0 },.
7360: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61  #else.  { "GetNa
7370: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
7380: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
73b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
73c0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
73d0: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
73e0: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  )( \.        LPS
73f0: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
7400: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
7410: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
7420: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
7430: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70  _ANSI).  { "Outp
7440: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
7450: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
7460: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7470: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
7480: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
7490: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
74a0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
74d0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
74e0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28  tDebugStringA ((
74f0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
7500: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  CSTR))aSyscall[7
7510: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
7520: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7530: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
7540: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
7550: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
7560: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
7570: 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20  ebugStringW,    
7580: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7590: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
75a0: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
75b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
75d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
75e0: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
75f0: 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57  StringW ((VOID(W
7600: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
7610: 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43  )aSyscall[71].pC
7620: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
7630: 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20  tProcessHeap",  
7640: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7650: 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c  )GetProcessHeap,
7660: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
7670: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
7680: 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c  cessHeap ((HANDL
7690: 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  E(WINAPI*)(VOID)
76a0: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
76b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
76c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
76d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
76e0: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43  OMIT_WAL).  { "C
76f0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
7700: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
7710: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
7720: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
7730: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7740: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
7750: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
7760: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7770: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7780: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7790: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
77a0: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
77b0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
77c0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
77d0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
77e0: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
77f0: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
7800: 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[73].pCurrent)
7810: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
7820: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
7830: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
7840: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
7850: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
7860: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
7870: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
7880: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e  l of the.** "win
7890: 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  32" VFSes.  Retu
78a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
78b0: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
78c0: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
78d0: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
78e0: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
78f0: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
7900: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
7910: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
7920: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
7930: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7940: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
7950: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
7960: 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f  otUsed,        /
7970: 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65  * The VFS pointe
7980: 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a  r.  Not used */.
7990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
79a0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
79b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65  /* Name of syste
79c0: 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69  m call to overri
79d0: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
79e0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77  syscall_ptr pNew
79f0: 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72  Func  /* Pointer
7a00: 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63   to new system c
7a10: 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  all value */.){.
7a20: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
7a30: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
7a40: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20  ITE_NOTFOUND;.. 
7a50: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7a60: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  R(pNotUsed);.  i
7a70: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
7a80: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d     /* If no zNam
7a90: 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74  e is given, rest
7aa0: 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63  ore all system c
7ab0: 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65  alls to their de
7ac0: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74  fault.    ** set
7ad0: 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e  tings and return
7ae0: 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20   NULL.    */.   
7af0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7b00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7b10: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
7b20: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
7b30: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
7b40: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
7b50: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  ].pDefault ){.  
7b60: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
7b70: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79  ].pCurrent = aSy
7b80: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
7b90: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7ba0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7bb0: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65   If zName is spe
7bc0: 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20  cified, operate 
7bd0: 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20  on only the one 
7be0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20  system call.    
7bf0: 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ** specified..  
7c00: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
7c10: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
7c20: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
7c30: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
7c40: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
7c50: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
7c60: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
7c70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79  .        if( aSy
7c80: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
7c90: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
7ca0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44    aSyscall[i].pD
7cb0: 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c  efault = aSyscal
7cc0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
7cd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7ce0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
7d00: 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46  wFunc==0 ) pNewF
7d10: 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  unc = aSyscall[i
7d20: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
7d30: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
7d40: 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46  pCurrent = pNewF
7d50: 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  unc;.        bre
7d60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7d70: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
7d80: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
7d90: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
7da0: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  a system call.  
7db0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
7dc0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  Name is not a.**
7dd0: 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74   recognized syst
7de0: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e  em call name.  N
7df0: 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ULL is also retu
7e00: 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74  rned if the syst
7e10: 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75  em call.** is cu
7e20: 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65  rrently undefine
7e30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  d..*/.static sql
7e40: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
7e50: 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
7e60: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
7e70: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
7e80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
7e90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
7ea0: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
7eb0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
7ec0: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
7ed0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
7ee0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
7ef0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
7f00: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7f10: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7f20: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
7f30: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
7f40: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
7f50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7f60: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
7f70: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
7f80: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
7f90: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
7fa0: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
7fb0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
7fc0: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
7fd0: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
7fe0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
7ff0: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
8000: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
8010: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
8020: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
8030: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
8040: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8050: 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79   char *winNextSy
8060: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
8070: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
8080: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
8090: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
80a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
80b0: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
80c0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
80d0: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
80e0: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
80f0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
8100: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
8110: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
8120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
8130: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
8140: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
8150: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
8160: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
8170: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
8180: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
8190: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
81a0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
81b0: 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74   function output
81c0: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
81d0: 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f  (ANSI) string to
81e0: 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67   the Win32 debug
81f0: 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c  ger.** (if avail
8200: 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20  able)..*/..void 
8210: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72  sqlite3_win32_wr
8220: 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20  ite_debug(const 
8230: 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20  char *zBuf, int 
8240: 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44  nBuf){.  char zD
8250: 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e  bgBuf[SQLITE_WIN
8260: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d  32_DBG_BUF_SIZE]
8270: 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d  ;.  int nMin = M
8280: 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45  IN(nBuf, (SQLITE
8290: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
82a0: 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61  IZE - 1)); /* ma
82b0: 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a  y be negative. *
82c0: 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20  /.  if( nMin<-1 
82d0: 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20  ) nMin = -1; /* 
82e0: 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c  all negative val
82f0: 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a  ues become -1. *
8300: 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e  /.  assert( nMin
8310: 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20  ==-1 || nMin==0 
8320: 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57  || nMin<SQLITE_W
8330: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
8340: 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  E );.#if defined
8350: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
8360: 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d  S_ANSI).  if( nM
8370: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
8380: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
8390: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
83a0: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
83b0: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
83c0: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
83d0: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
83e0: 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20  ingA(zDbgBuf);. 
83f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75   }else{.    osOu
8400: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
8410: 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69  (zBuf);.  }.#eli
8420: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
8430: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
8440: 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75  .  memset(zDbgBu
8450: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
8460: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
8470: 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69  ;.  if ( osMulti
8480: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a  ByteToWideChar(.
8490: 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65 46            osAreF
84a0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
84b0: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
84c0: 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20  P, 0, zBuf,.    
84d0: 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57        nMin, (LPW
84e0: 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c  STR)zDbgBuf, SQL
84f0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
8500: 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43  F_SIZE/sizeof(WC
8510: 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20  HAR))<=0 ){.    
8520: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73  return;.  }.  os
8530: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8540: 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67  gW((LPCWSTR)zDbg
8550: 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
8560: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
8570: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
8580: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
8590: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
85a0: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
85b0: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
85c0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
85d0: 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75  rr, "%s", zDbgBu
85e0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
85f0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
8600: 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20   "%s", zBuf);.  
8610: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
8620: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8630: 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73  routine suspends
8640: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
8650: 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ead for at least
8660: 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f   ms.** milliseco
8670: 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65 71  nds.  This is eq
8680: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
8690: 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e  Win32 Sleep() in
86a0: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20  terface..*/.#if 
86b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
86c0: 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c  static HANDLE sl
86d0: 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23  eepObj = NULL;.#
86e0: 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69  endif..void sqli
86f0: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
8700: 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e  DWORD millisecon
8710: 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ds){.#if SQLITE_
8720: 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20  OS_WINRT.  if ( 
8730: 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29  sleepObj==NULL )
8740: 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d  {.    sleepObj =
8750: 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78   osCreateEventEx
8760: 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52  W(NULL, NULL, CR
8770: 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41  EATE_EVENT_MANUA
8780: 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20  L_RESET,.       
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87a0: 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f           SYNCHRO
87b0: 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73  NIZE);.  }.  ass
87c0: 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e  ert( sleepObj!=N
87d0: 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46  ULL );.  osWaitF
87e0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
87f0: 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69  (sleepObj, milli
8800: 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b  seconds, FALSE);
8810: 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70  .#else.  osSleep
8820: 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a  (milliseconds);.
8830: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8840: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
8850: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
8860: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
8870: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
8880: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
8890: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
88a0: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
88b0: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
88c0: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
88d0: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
88e0: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
88f0: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
8900: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
8910: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
8920: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
8930: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
8940: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
8950: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
8960: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
8970: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
8980: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
8990: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
89a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
89b0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
89c0: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
89d0: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
89e0: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
89f0: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
8a00: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
8a10: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
8a20: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
8a30: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23  leEx() API..*/.#
8a40: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8a50: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
8a60: 57 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20 69  WINRT.# define i
8a70: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
8a80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8a90: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
8aa0: 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29  .# define isNT()
8ab0: 20 20 28 30 29 0a 23 65 6c 73 65 0a 20 20 73 74    (0).#else.  st
8ac0: 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f  atic int isNT(vo
8ad0: 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  id){.    if( sql
8ae0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20  ite3_os_type==0 
8af0: 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  ){.      OSVERSI
8b00: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
8b10: 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56       sInfo.dwOSV
8b20: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
8b30: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
8b40: 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69        osGetVersi
8b50: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
8b60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
8b70: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
8b80: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
8b90: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
8ba0: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
8bb0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8bc0: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
8bd0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
8be0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
8bf0: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ALLOC./*.** Allo
8c00: 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d  cate nBytes of m
8c10: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
8c20: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
8c30: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b  loc(int nBytes){
8c40: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
8c50: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
8c60: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
8c70: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
8c80: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
8c90: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
8ca0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
8cb0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
8cc0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
8cd0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
8ce0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
8cf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
8d00: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
8d10: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
8d20: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
8d30: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8d40: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
8d50: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
8d60: 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70  nBytes>=0 );.  p
8d70: 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68   = osHeapAlloc(h
8d80: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
8d90: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28  32_HEAP_FLAGS, (
8da0: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
8db0: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
8dc0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
8dd0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
8de0: 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25  d to HeapAlloc %
8df0: 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65  u bytes (%d), he
8e00: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
8e10: 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20          nBytes, 
8e20: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8e30: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
8e40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d  .}../*.** Free m
8e60: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
8e70: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65   void winMemFree
8e80: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a  (void *pPrior){.
8e90: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
8ea0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
8eb0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
8ec0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
8ed0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
8ee0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
8ef0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
8f00: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
8f10: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
8f20: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
8f30: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
8f40: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
8f50: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
8f60: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
8f70: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
8f80: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
8f90: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ) );.#endif.  if
8fa0: 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 75  ( !pPrior ) retu
8fb0: 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e  rn; /* Passing N
8fc0: 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20  ULL to HeapFree 
8fd0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f  is undefined. */
8fe0: 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 72  .  if( !osHeapFr
8ff0: 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ee(hHeap, SQLITE
9000: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9010: 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20  S, pPrior) ){.  
9020: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
9030: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
9040: 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20  led to HeapFree 
9050: 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68  block %p (%d), h
9060: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
9070: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c           pPrior,
9080: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9090: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
90a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
90b0: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
90c0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65  f an existing me
90d0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
90e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
90f0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
9100: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
9110: 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c  nBytes){.  HANDL
9120: 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20  E hHeap;.  void 
9130: 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  *p;..  winMemAss
9140: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
9150: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
9160: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
9170: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
9180: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
9190: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
91a0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
91b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
91c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
91d0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
91e0: 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f  TE).  assert ( o
91f0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
9200: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9210: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
9220: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
9230: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
9240: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
9250: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20  rior ){.    p = 
9260: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
9270: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9280: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
9290: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
92a0: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73  else{.    p = os
92b0: 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61  HeapReAlloc(hHea
92c0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
92d0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
92e0: 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  or, (SIZE_T)nByt
92f0: 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  es);.  }.  if( !
9300: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
9310: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
9320: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73  M, "failed to %s
9330: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
9340: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
9350: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
9360: 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   ? "HeapReAlloc"
9370: 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20   : "HeapAlloc", 
9380: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
9390: 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
93a0: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
93b0: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
93c0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
93d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
93e0: 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64  e of an outstand
93f0: 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  ing allocation, 
9400: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  in bytes..*/.sta
9410: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
9420: 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48  ze(void *p){.  H
9430: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53  ANDLE hHeap;.  S
9440: 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d  IZE_T n;..  winM
9450: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
9460: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
9470: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
9480: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
9490: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
94a0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
94b0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
94c0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
94d0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
94e0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
94f0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
9500: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
9510: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
9520: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9530: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
9540: 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  if.  if( !p ) re
9550: 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73  turn 0;.  n = os
9560: 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20  HeapSize(hHeap, 
9570: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9580: 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69  P_FLAGS, p);.  i
9590: 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31  f( n==(SIZE_T)-1
95a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
95b0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
95c0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
95d0: 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28  pSize block %p (
95e0: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9600: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
9610: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
9620: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
9630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
9640: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
9650: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
9660: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
9670: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
9680: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
9690: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
96a0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
96b0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
96c0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
96d0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
96e0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
96f0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
9700: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
9710: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
9720: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
9730: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
9740: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
9750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
9760: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
9770: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
9780: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29  ==WINMEM_MAGIC )
9790: 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ;..#if !SQLITE_O
97a0: 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
97b0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
97c0: 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  ATE.  if( !pWinM
97d0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
97e0: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
97f0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70  ->hHeap = osHeap
9800: 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49  Create(SQLITE_WI
9810: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
9850: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
9860: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
9890: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
98a0: 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 21 70  IZE);.    if( !p
98b0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
98c0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
98d0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
98e0: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22  MEM,.          "
98f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72  failed to HeapCr
9900: 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61 67 73  eate (%d), flags
9910: 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75  =%u, initSize=%u
9920: 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20  , maxSize=%u",. 
9930: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
9940: 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54  stError(), SQLIT
9950: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9960: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51  GS,.          SQ
9970: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9980: 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54  INIT_SIZE, SQLIT
9990: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
99a0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 65  _SIZE);.      re
99b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
99c0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  M;.    }.    pWi
99d0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
99e0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73   = TRUE;.    ass
99f0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
9a00: 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a  ->bOwned );.  }.
9a10: 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44  #else.  pWinMemD
9a20: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47  ata->hHeap = osG
9a30: 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b  etProcessHeap();
9a40: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
9a50: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
9a60: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
9a70: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20  LITE_NOMEM,.    
9a80: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47      "failed to G
9a90: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25  etProcessHeap (%
9aa0: 64 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  d)", osGetLastEr
9ab0: 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75  ror());.    retu
9ac0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9ad0: 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61  .  }.  pWinMemDa
9ae0: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c  ta->bOwned = FAL
9af0: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  SE;.  assert( !p
9b00: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
9b10: 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ed );.#endif.  a
9b20: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
9b30: 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a  ta->hHeap!=0 );.
9b40: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
9b50: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e  mData->hHeap!=IN
9b60: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
9b70: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
9b80: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9b90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9ba0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9bb0: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
9bc0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
9bd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
9be0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9bf0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
9c00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
9c10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9c20: 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c  ./*.** Deinitial
9c30: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
9c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9c50: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
9c60: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
9c70: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
9c80: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
9c90: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
9ca0: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
9cb0: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
9cc0: 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44  ;.  if( pWinMemD
9cd0: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
9ce0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
9cf0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e  mData->hHeap!=IN
9d00: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
9d10: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
9d20: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9d30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9d40: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9d50: 54 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20  TE).    assert( 
9d60: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
9d70: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9d80: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9d90: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9da0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ) );.#endif.    
9db0: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
9dc0: 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20  >bOwned ){.     
9dd0: 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74   if( !osHeapDest
9de0: 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  roy(pWinMemData-
9df0: 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20  >hHeap) ){.     
9e00: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
9e10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
9e20: 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74  iled to HeapDest
9e30: 72 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25  roy (%d), heap=%
9e40: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9e50: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
9e60: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
9e70: 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  )pWinMemData->hH
9e80: 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eap);.      }.  
9e90: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
9ea0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
9eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
9ec0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
9ed0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
9ee0: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
9ef0: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
9f00: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
9f10: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e  tion pointers in
9f20: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  .** sqlite3Globa
9f30: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70  lConfig.m with p
9f40: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72  ointers to the r
9f50: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
9f60: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67  file. The.** arg
9f70: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74  uments specify t
9f80: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
9f90: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a  ry to manage..**
9fa0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9fb0: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
9fc0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  by sqlite3_confi
9fd0: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f  g(), and therefo
9fe0: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71  re.** is not req
9ff0: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65  uired to be thre
a000: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f  adsafe (it is no
a010: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  t)..*/.const sql
a020: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
a030: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
a040: 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74  in32(void){.  st
a050: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
a060: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77  e3_mem_methods w
a070: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b  inMemMethods = {
a080: 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  .    winMemMallo
a090: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65  c,.    winMemFre
a0a0: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61  e,.    winMemRea
a0b0: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
a0c0: 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Size,.    winMem
a0d0: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e  Roundup,.    win
a0e0: 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e  MemInit,.    win
a0f0: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
a100: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20   &win_mem_data. 
a110: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69   };.  return &wi
a120: 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a  nMemMethods;.}..
a130: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53  void sqlite3MemS
a140: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b  etDefault(void){
a150: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
a160: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
a170: 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d  MALLOC, sqlite3M
a180: 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d  emGetWin32());.}
a190: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a1a0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
a1b0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
a1c0: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
a1d0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
a1e0: 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20  code (UTF-16?). 
a1f0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
a200: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
a210: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
a220: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
a230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
a240: 54 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65  TR utf8ToUnicode
a250: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
a260: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
a270: 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
a280: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
a290: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
a2a0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
a2b0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
a2c0: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
a2d0: 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
a2e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a2f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
a300: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
a310: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
a320: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
a330: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
a340: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
a350: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
a360: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
a370: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
a380: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
a390: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
a3a0: 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e  , -1, zWideFilen
a3b0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
a3e0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
a3f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a400: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a  zWideFilename);.
a410: 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d      zWideFilenam
a420: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
a430: 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  urn zWideFilenam
a440: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
a450: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
a460: 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20  icode to UTF-8. 
a470: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
a480: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
a490: 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ng is.** obtaine
a4a0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
a4b0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
a4c0: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
a4d0: 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a  ToUtf8(LPCWSTR z
a4e0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
a4f0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
a500: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
a510: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
a520: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
a530: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
a540: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
a550: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
a560: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
a570: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a580: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
a590: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
a5a0: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
a5b0: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
a5c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a5d0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
a5e0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
a5f0: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
a600: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
a610: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  1, zFilename, nB
a620: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a640: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
a650: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
a660: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a670: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
a680: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
a690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
a6a0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
a6b0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49   Convert an ANSI
a6c0: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
a6d0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61  soft Unicode, ba
a6e0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75  sed on the.** cu
a6f0: 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73  rrent codepage s
a700: 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65  ettings for file
a710: 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70   apis..** .** Sp
a720: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
a730: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
a740: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
a750: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
a760: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50  oc..*/.static LP
a770: 57 53 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f  WSTR mbcsToUnico
a780: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
a790: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
a7a0: 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52   nByte;.  LPWSTR
a7b0: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a   zMbcsFilename;.
a7c0: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
a7d0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
a7e0: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
a7f0: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
a800: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
a810: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
a820: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
a830: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20  e, -1, NULL,.   
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a               0)*
a860: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20  sizeof(WCHAR);. 
a870: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
a880: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a890: 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61   }.  zMbcsFilena
a8a0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
a8b0: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
a8c0: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
a8d0: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
a8e0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
a8f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a900: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
a910: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
a920: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
a930: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
a940: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
a950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
a980: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
a990: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
a9a0: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  sFilename);.    
a9b0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
a9c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a9d0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zMbcsFilename;.}
a9e0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
a9f0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
aa00: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20  e to multi-byte 
aa10: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
aa20: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
aa30: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f  * user's ANSI co
aa40: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  depage..**.** Sp
aa50: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
aa60: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
aa70: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
aa80: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
aa90: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
aaa0: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d  char *unicodeToM
aab0: 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64  bcs(LPCWSTR zWid
aac0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
aad0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
aae0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
aaf0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
ab00: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
ab10: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
ab20: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
ab30: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
ab40: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
ab50: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
ab60: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
ab70: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
ab80: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
ab90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
aba0: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
abb0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
abc0: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
abd0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
abe0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
abf0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
ac00: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
ac10: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
ac20: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
ac30: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac50: 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c         nByte, 0,
ac60: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
ac70: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c   == 0 ){.    sql
ac80: 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e  ite3_free(zFilen
ac90: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
aca0: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
acb0: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
acc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
acd0: 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  t multibyte char
ace0: 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20  acter string to 
acf0: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
ad00: 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74   hold the.** ret
ad10: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
ad20: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
ad30: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
ad40: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
ad50: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
ad60: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tf8(const char *
ad70: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
ad80: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66  ar *zFilenameUtf
ad90: 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  8;.  LPWSTR zTmp
ada0: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
adb0: 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  e = mbcsToUnicod
adc0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
add0: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
ade0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
adf0: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
ae00: 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Utf8 = unicodeTo
ae10: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
ae20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ae30: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
ae40: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
ae50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
ae60: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
ae70: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
ae80: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
ae90: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
aea0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
aeb0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
aec0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
aed0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
aee0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
aef0: 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72  _mbcs(const char
af00: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
af10: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d  char *zFilenameM
af20: 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  bcs;.  LPWSTR zT
af30: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
af40: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ide = utf8ToUnic
af50: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
af60: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
af70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
af80: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
af90: 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65  meMbcs = unicode
afa0: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29  ToMbcs(zTmpWide)
afb0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
afc0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
afd0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62  turn zFilenameMb
afe0: 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  cs;.}../*.** Thi
aff0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
b000: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
b010: 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  ry or the tempor
b020: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61  ary directory ba
b030: 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72  sed on.** the pr
b040: 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73  ovided arguments
b050: 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75  .  The type argu
b060: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69  ment must be 1 i
b070: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
b080: 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63  he.** data direc
b090: 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64  tory or 2 in ord
b0a0: 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65  er to set the te
b0b0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
b0c0: 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a  y.  The zValue.*
b0d0: 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  * argument is th
b0e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
b0f0: 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20  rectory to use. 
b100: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
b110: 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c  e will be.** SQL
b120: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
b130: 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sful..*/.int sql
b140: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
b150: 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74  irectory(DWORD t
b160: 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61  ype, LPCWSTR zVa
b170: 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70  lue){.  char **p
b180: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  pDirectory = 0;.
b190: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b1a0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
b1b0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
b1c0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
b1d0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
b1e0: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
b1f0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
b200: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
b210: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
b220: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
b230: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
b240: 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tory;.  }else if
b250: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
b260: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
b270: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
b280: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
b290: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
b2a0: 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73  ctory;.  }.  ass
b2b0: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
b2c0: 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54  y || type==SQLIT
b2d0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
b2e0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20  ECTORY_TYPE.    
b2f0: 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53        || type==S
b300: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
b310: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
b320: 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21    );.  assert( !
b330: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73  ppDirectory || s
b340: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61  qlite3MemdebugHa
b350: 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f  sType(*ppDirecto
b360: 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  ry, MEMTYPE_HEAP
b370: 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72  ) );.  if( ppDir
b380: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68  ectory ){.    ch
b390: 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d  ar *zValueUtf8 =
b3a0: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c   0;.    if( zVal
b3b0: 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20  ue && zValue[0] 
b3c0: 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55  ){.      zValueU
b3d0: 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  tf8 = unicodeToU
b3e0: 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20  tf8(zValue);.   
b3f0: 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74     if ( zValueUt
b400: 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f8==0 ){.       
b410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b420: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
b430: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b440: 66 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72  free(*ppDirector
b450: 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63  y);.    *ppDirec
b460: 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66  tory = zValueUtf
b470: 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  8;.    return SQ
b480: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
b490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b4a0: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OR;.}../*.** The
b4b0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
b4c0: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
b4d0: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
b4e0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
b4f0: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
b500: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
b510: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
b520: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
b530: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
b540: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c  .static int getL
b550: 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52  astErrorMsg(DWOR
b560: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74  D lastErrno, int
b570: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
b580: 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d  f){.  /* FormatM
b590: 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30  essage returns 0
b5a0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74   on failure.  Ot
b5b0: 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20  herwise it.  ** 
b5c0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
b5d0: 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69  er of TCHARs wri
b5e0: 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
b5f0: 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  ut.  ** buffer, 
b600: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  excluding the te
b610: 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63  rminating null c
b620: 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52  har..  */.  DWOR
b630: 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  D dwLen = 0;.  c
b640: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a  har *zOut = 0;..
b650: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
b660: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
b670: 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54  NRT.    WCHAR zT
b680: 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57  empWide[SQLITE_W
b690: 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f  IN32_MAX_ERRMSG_
b6a0: 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77  CHARS+1];.    dw
b6b0: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
b6c0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
b6d0: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
b6e0: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b710: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
b740: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b780: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
b7b0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
b7e0: 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20  _ERRMSG_CHARS,. 
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b800: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
b810: 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52  #else.    LPWSTR
b820: 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c   zTempWide = NUL
b830: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
b840: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
b850: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
b860: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
b870: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
b890: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
b8a0: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8c0: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
b8d0: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
b8e0: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
b930: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b950: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b970: 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69  LPWSTR) &zTempWi
b980: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
b9d0: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
b9e0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
b9f0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
ba00: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
ba10: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
ba20: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
ba30: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
ba40: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
ba50: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
ba60: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
ba70: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20  gnMalloc();.#if 
ba80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
ba90: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
baa0: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
bab0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
bac0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
bad0: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
bae0: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e  (zTempWide);.#en
baf0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  dif.    }.  }.#i
bb00: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
bb10: 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
bb20: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
bb30: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
bb40: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
bb50: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
bb60: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
bb70: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
bba0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
bbb0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
bbe0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
bc10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
bc30: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc70: 20 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26         (LPSTR) &
bc80: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
bcd0: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
bce0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
bcf0: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
bd00: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
bd10: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
bd20: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
bd30: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  .      zOut = sq
bd40: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
bd50: 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
bd60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
bd70: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
bd80: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
bd90: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
bda0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
bdb0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
bdc0: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
bdd0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  (zTemp);.    }. 
bde0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
bdf0: 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20  0 == dwLen ){.  
be00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
be10: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
be20: 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25  OsError 0x%lx (%
be30: 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  lu)", lastErrno,
be40: 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d   lastErrno);.  }
be50: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70  else{.    /* cop
be60: 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e  y a maximum of n
be70: 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74  Buf chars to out
be80: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
be90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
bea0: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
beb0: 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
bec0: 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38  /* free the UTF8
bed0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
bee0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
bef0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
bf00: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  0;.}../*.**.** T
bf10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77  his function - w
bf20: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
bf30: 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65  () - is only eve
bf40: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
bf50: 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67   macro.** winLog
bf60: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Error()..**.** T
bf70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
bf80: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
bf90: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
bfa0: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a  an OS function..
bfb0: 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  ** It logs a mes
bfc0: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
bfd0: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
bfe0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
bff0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f  value of.** erro
c000: 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70  r code and, if p
c010: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
c020: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
c030: 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20  valent from .** 
c040: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a  FormatMessage..*
c050: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
c060: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
c070: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
c080: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
c090: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
c0a0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
c0b0: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
c0c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
c0d0: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
c0e0: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
c0f0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
c100: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
c110: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c120: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
c130: 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74  .** failed and t
c140: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  he associated fi
c150: 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20  le-system path, 
c160: 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69  if any..*/.#defi
c170: 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61  ne winLogError(a
c180: 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67  ,b,c,d)   winLog
c190: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
c1a0: 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74  c,d,__LINE__).st
c1b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45  atic int winLogE
c1c0: 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e  rrorAtLine(.  in
c1d0: 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20  t errcode,      
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1f0: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
c200: 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  de */.  DWORD la
c210: 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20  stErrno,        
c220: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32          /* Win32
c230: 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20   last error */. 
c240: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
c250: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
c260: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66   /* Name of OS f
c270: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69  unction that fai
c280: 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  led */.  const c
c290: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
c2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
c2b0: 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64   path associated
c2c0: 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20   with error */. 
c2d0: 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20   int iLine      
c2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2f0: 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20   /* Source line 
c300: 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72  number where err
c310: 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29  or occurred */.)
c320: 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30  {.  char zMsg[50
c330: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0];             
c340: 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61      /* Human rea
c350: 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74  dable error text
c360: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c380: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
c390: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67  unter */..  zMsg
c3a0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61  [0] = 0;.  getLa
c3b0: 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45  stErrorMsg(lastE
c3c0: 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73  rrno, sizeof(zMs
c3d0: 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73  g), zMsg);.  ass
c3e0: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
c3f0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
c400: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
c410: 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d  h = "";.  for(i=
c420: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d  0; zMsg[i] && zM
c430: 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a  sg[i]!='\r' && z
c440: 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b  Msg[i]!='\n'; i+
c450: 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d  +){}.  zMsg[i] =
c460: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   0;.  sqlite3_lo
c470: 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
c480: 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28   "os_win.c:%d: (
c490: 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73  %lu) %s(%s) - %s
c4a0: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
c4b0: 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
c4c0: 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
c4d0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
c4e0: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
c4f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
c500: 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
c510: 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
c520: 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
c530: 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
c540: 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
c550: 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
c560: 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
c570: 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69  ed by .** antivi
c580: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
c590: 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
c5a0: 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
c5b0: 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
c5c0: 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
c5d0: 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
c5e0: 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
c5f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c600: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
c610: 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
c620: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c630: 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
c640: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
c650: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
c660: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
c670: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c680: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
c690: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
c6a0: 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74  nt win32IoerrRet
c6b0: 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ry = SQLITE_WIN3
c6c0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73  2_IOERR_RETRY;.s
c6d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49  tatic int win32I
c6e0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
c6f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c700: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
c710: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
c720: 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
c730: 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
c740: 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
c750: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
c760: 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
c770: 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
c780: 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
c790: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
c7a0: 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
c7b0: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
c7c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74 72  .static int retr
c7d0: 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65  yIoerr(int *pnRe
c7e0: 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72  try, DWORD *pErr
c7f0: 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  or){.  DWORD e =
c800: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c810: 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72  );.  if( *pnRetr
c820: 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52 65 74  y>=win32IoerrRet
c830: 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ry ){.    if( pE
c840: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
c850: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d  Error = e;.    }
c860: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c870: 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f   }.  if( e==ERRO
c880: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 20  R_ACCESS_DENIED 
c890: 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f  ||.      e==ERRO
c8a0: 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e  R_LOCK_VIOLATION
c8b0: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
c8c0: 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  OR_SHARING_VIOLA
c8d0: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TION ){.    sqli
c8e0: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
c8f0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
c900: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
c910: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
c920: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
c930: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72  ;.  }.  if( pErr
c940: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
c950: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
c960: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c970: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
c980: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
c990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  /.static void lo
c9a0: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
c9b0: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
c9c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c9d0: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
c9e0: 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  , .      "delaye
c9f0: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
ca00: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
ca10: 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f  ",.      win32Io
ca20: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
ca30: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
ca40: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
ca50: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
ca60: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
ca70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ca90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
caa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
cab0: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
cac0: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
cad0: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
cae0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
caf0: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
cb00: 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49  ME_API) || !SQLI
cb10: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
cb20: 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E_API./*.** The 
cb30: 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
cb40: 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
cb50: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
cb60: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a  ) function.  So.
cb70: 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73  ** create a subs
cb80: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
cb90: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
cba0: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
cbb0: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
cbc0: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
cbd0: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
cbe0: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
cbf0: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
cc00: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69  TIME pTm;.  sqli
cc10: 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20  te3_int64 t64;. 
cc20: 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34   t64 = *t;.  t64
cc30: 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34   = (t64 + 116444
cc40: 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b  73600)*10000000;
cc50: 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65  .  uTm.dwLowDate
cc60: 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74  Time = (DWORD)(t
cc70: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29  64 & 0xFFFFFFFF)
cc80: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
cc90: 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28  teTime= (DWORD)(
cca0: 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73  t64 >> 32);.  os
ccb0: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
ccc0: 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54  ileTime(&uTm,&lT
ccd0: 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  m);.  osFileTime
cce0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
ccf0: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
cd00: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
cd10: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
cd20: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
cd30: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
cd40: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
cd50: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
cd60: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
cd70: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
cd80: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
cd90: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
cda0: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
cdb0: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
cdc0: 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n &y;.}.#endif..
cdd0: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
cde0: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
cdf0: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
ce00: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
ce10: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
ce20: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
ce30: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
ce40: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
ce50: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
ce60: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
ce70: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
ce80: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
ce90: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
cea0: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
ceb0: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
cec0: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
ced0: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
cee0: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
cef0: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
cf00: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
cf10: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
cf20: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
cf30: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
cf40: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
cf50: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
cf60: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
cf70: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
cf80: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
cf90: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
cfa0: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
cfb0: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
cfc0: 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72  atic int winceCr
cfd0: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
cfe0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
cff0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
d000: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a  .  LPWSTR zTok;.
d010: 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a    LPWSTR zName;.
d020: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
d030: 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65  o;.  BOOL bLogge
d040: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f  d = FALSE;.  BOO
d050: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
d060: 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54  .  zName = utf8T
d070: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
d080: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
d090: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
d0a0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
d0b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d0c0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
d0d0: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
d0e0: 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ze the local loc
d0f0: 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65  kdata */.  memse
d100: 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  t(&pFile->local,
d110: 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65   0, sizeof(pFile
d120: 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
d130: 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
d140: 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
d150: 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
d160: 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
d170: 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
d180: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
d190: 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72  ok = osCharLower
d1a0: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
d1b0: 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
d1c0: 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
d1d0: 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
d1e0: 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
d1f0: 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
d200: 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
d210: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
d220: 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  osCreateMutexW(N
d230: 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
d240: 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
d250: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
d260: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d270: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
d280: 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
d290: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
d2a0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d2b0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d2c0: 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
d2d0: 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
d2e0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
d2f0: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
d300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
d310: 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OERR;.  }..  /* 
d320: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
d330: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
d340: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
d350: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
d360: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
d370: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
d380: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
d390: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
d3a0: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
d3b0: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
d3c0: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
d3d0: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
d3e0: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
d3f0: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
d400: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
d410: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
d420: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
d430: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
d440: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
d450: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
d460: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
d470: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
d480: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
d490: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
d4c0: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
d4d0: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
d4e0: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
d510: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
d520: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
d530: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
d540: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
d550: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
d560: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
d570: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
d580: 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  */.  lastErrno =
d590: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
d5a0: 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72  );.  if (lastErr
d5b0: 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  no == ERROR_ALRE
d5c0: 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
d5d0: 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
d5e0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
d5f0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f  ree(zName);..  /
d600: 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65  * If we succeede
d610: 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20  d in making the 
d620: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
d630: 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f  ndle, map it. */
d640: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
d650: 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69  hared ){.    pFi
d660: 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69  le->shared = (wi
d670: 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69  nceLock*)osMapVi
d680: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
d690: 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20  hShared, .      
d6a0: 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f         FILE_MAP_
d6b0: 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52  READ|FILE_MAP_WR
d6c0: 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f  ITE, 0, 0, sizeo
d6d0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
d6e0: 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67     /* If mapping
d6f0: 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74   failed, close t
d700: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
d710: 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73   handle and eras
d720: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  e it */.    if( 
d730: 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29  !pFile->shared )
d740: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
d750: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
d760: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
d770: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
d780: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
d790: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
d7c0: 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
d7d0: 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
d7e0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43   TRUE;.      osC
d7f0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
d800: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20  ->hShared);.    
d810: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
d820: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
d830: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72   }..  /* If shar
d840: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20  ed memory could 
d850: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20  not be created, 
d860: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d  then close the m
d870: 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f  utex and fail */
d880: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
d890: 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  hared==NULL ){. 
d8a0: 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20     if( !bLogged 
d8b0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d8c0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
d8d0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e  Errno;.      win
d8e0: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
d8f0: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
d900: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
d910: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
d920: 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a  eCreateLock3", z
d930: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
d940: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
d950: 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65  .    }.    wince
d960: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
d970: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
d980: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
d990: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d9a0: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
d9b0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74   = NULL;.    ret
d9c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
d9d0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e  ;.  }.  .  /* In
d9e0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61  itialize the sha
d9f0: 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65  red memory if we
da00: 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20  're supposed to 
da10: 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29  */.  if( bInit )
da20: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  {.    memset(pFi
da30: 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73  le->shared, 0, s
da40: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
da50: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
da60: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
da70: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
da80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
da90: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
daa0: 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e   the part of win
dab0: 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20  File that deals 
dac0: 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73  with wince locks
dad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
dae0: 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
daf0: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
db00: 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  {.  if (pFile->h
db10: 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41  Mutex){.    /* A
db20: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
db30: 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
db40: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
db50: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >hMutex);..    /
db60: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
db70: 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72  blocks should pr
db80: 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e  obably assert in
db90: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74   debug mode, but
dba0: 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65   they.       are
dbb0: 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63   to cleanup in c
dbc0: 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65  ase any locks re
dbd0: 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20  mained open */. 
dbe0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
dbf0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
dc00: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
dc10: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
dc20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
dc30: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
dc40: 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46  erved){.      pF
dc50: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
dc60: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
dc70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
dc80: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
dc90: 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
dca0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
dcb0: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
dcc0: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
dcd0: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
dce0: 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ve){.      pFile
dcf0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
dd00: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
dd10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72    }..    /* De-r
dd20: 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f  eference and clo
dd30: 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74  se our copy of t
dd40: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
dd50: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f   handle */.    o
dd60: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
dd70: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b  (pFile->shared);
dd80: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
dd90: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
dda0: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65  d);..    /* Done
ddb0: 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20   with the mutex 
ddc0: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
ddd0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
dde0: 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20  hMutex);    .   
ddf0: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
de00: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
de10: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
de20: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
de30: 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  /* .** An implem
de40: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
de50: 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
de60: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
de70: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
de80: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
de90: 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
dea0: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
deb0: 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
dec0: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
ded0: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
dee0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
def0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
df00: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
df10: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
df20: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
df30: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
df40: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
df50: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
df60: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
df70: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
df80: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
df90: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
dfa0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
dfb0: 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
dfc0: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
dfd0: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
dfe0: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
dff0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
e000: 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
e010: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
e020: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
e030: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
e040: 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
e050: 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
e060: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
e070: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
e080: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
e090: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
e0a0: 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
e0b0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e0c0: 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
e0d0: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
e0e0: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
e0f0: 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
e100: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
e110: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
e120: 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
e130: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
e140: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
e150: 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
e160: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
e170: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e180: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
e190: 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
e1a0: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
e1b0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
e1c0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
e1d0: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
e1e0: 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
e1f0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
e200: 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
e210: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e220: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
e230: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
e240: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
e250: 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
e260: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e270: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
e280: 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
e290: 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
e2a0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
e2b0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e2c0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
e2d0: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
e2e0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
e2f0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
e300: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
e310: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
e320: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
e330: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
e340: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
e350: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
e360: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
e370: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
e380: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
e390: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
e3a0: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
e3b0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
e3c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e3d0: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
e3e0: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
e3f0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
e400: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e410: 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
e420: 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
e430: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
e440: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
e450: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
e460: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
e470: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
e480: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
e490: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
e4a0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
e4b0: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
e4c0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e4d0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e4e0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
e4f0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
e500: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
e510: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
e520: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
e530: 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
e540: 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
e550: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
e560: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
e570: 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
e580: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
e590: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
e5a0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
e5b0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
e5c0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
e5d0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
e5e0: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
e5f0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e600: 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
e610: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
e620: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
e630: 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
e640: 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
e650: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e660: 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
e670: 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
e680: 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
e690: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
e6a0: 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
e6b0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
e6c0: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
e6d0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
e6e0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
e6f0: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
e700: 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
e710: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
e720: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
e730: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e740: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
e750: 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
e760: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
e770: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
e780: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e790: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
e7a0: 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
e7b0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e7c0: 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
e7d0: 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
e7e0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
e7f0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
e800: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
e810: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
e820: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
e830: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e840: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
e850: 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
e860: 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
e870: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
e880: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
e890: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
e8a0: 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
e8b0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e8c0: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
e8d0: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
e8e0: 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
e8f0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e900: 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
e910: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
e920: 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
e930: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
e940: 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
e950: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
e960: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
e970: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
e980: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e990: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e9a0: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
e9b0: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
e9c0: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e9d0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e9e0: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
e9f0: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
ea00: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
ea10: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
ea20: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
ea30: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
ea40: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
ea50: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
ea60: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
ea70: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
ea80: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
ea90: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
eaa0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
eab0: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
eac0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
ead0: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
eae0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
eaf0: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
eb00: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
eb10: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
eb20: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
eb30: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
eb40: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
eb50: 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
eb60: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
eb70: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
eb80: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
eb90: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
eba0: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
ebb0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
ebc0: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
ebd0: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
ebe0: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
ebf0: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
ec00: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
ec10: 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
ec20: 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
ec30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec70: 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
ec80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
ec90: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
eca0: 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
ecb0: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
ecc0: 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
ecd0: 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
ece0: 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
ecf0: 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
ed00: 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
ed10: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
ed20: 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
ed30: 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
ed40: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
ed50: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
ed60: 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
ed70: 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
ed80: 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
ed90: 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
eda0: 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
edb0: 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
edc0: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
edd0: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
ede0: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
edf0: 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
ee10: 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
ee20: 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
ee30: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
ee40: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
ee50: 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
ee60: 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
ee70: 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
ee80: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
ee90: 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
eea0: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
eeb0: 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
eec0: 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
eed0: 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66  ileEx(*phFile, f
eee0: 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65  lags, 0, numByte
eef0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
ef00: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
ef10: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
ef20: 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  osLockFile(*phFi
ef30: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
ef40: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
ef50: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
ef70: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
ef80: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ef90: 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72   Unlock a file r
efa0: 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69  egion.. */.stati
efb0: 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b  c BOOL winUnlock
efc0: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
efd0: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
efe0: 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
eff0: 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
f000: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
f010: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
f020: 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66  BytesHigh.){.#if
f030: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
f040: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
f050: 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
f060: 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
f070: 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
f080: 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
f090: 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49  2.  **       API
f0a0: 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a   UnlockFile..  *
f0b0: 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
f0c0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  UnlockFile(phFil
f0d0: 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
f0e0: 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f100: 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20     numBytesLow, 
f110: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23  numBytesHigh);.#
f120: 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28  else.  if( isNT(
f130: 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
f140: 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
f150: 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
f160: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
f170: 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
f180: 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
f190: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
f1a0: 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
f1b0: 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
f1c0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
f1d0: 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
f1e0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
f1f0: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
f200: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
f210: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
f220: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
f230: 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
f240: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
f270: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
f280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
f2d0: 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
f2e0: 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
f2f0: 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
f300: 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
f310: 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
f320: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
f330: 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
f340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f380: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
f390: 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
f3a0: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
f3b0: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
f3c0: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
f3d0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
f3e0: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
f3f0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f400: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
f410: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
f420: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
f430: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
f440: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
f450: 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
f460: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
f470: 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
f480: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
f490: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
f4a0: 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  n 0. .** Otherwi
f4b0: 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c  se, set pFile->l
f4c0: 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74  astErrno and ret
f4d0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
f4e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
f4f0: 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  WinFile(winFile 
f500: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
f510: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
f520: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
f530: 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65  INRT.  LONG uppe
f540: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
f550: 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73         /* Most s
f560: 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e  ig. 32 bits of n
f570: 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c  ew offset */.  L
f580: 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20  ONG lowerBits;  
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f5a0: 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20  * Least sig. 32 
f5b0: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
f5c0: 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  et */.  DWORD dw
f5d0: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
f5e0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
f5f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74   returned by Set
f600: 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f  FilePointer() */
f610: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
f620: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
f630: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
f640: 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
f650: 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54  rror() */..  OST
f660: 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
f670: 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
f680: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69  \n", pFile->h, i
f690: 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70  Offset));..  upp
f6a0: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
f6b0: 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  (iOffset>>32) & 
f6c0: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c  0x7fffffff);.  l
f6d0: 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  owerBits = (LONG
f6e0: 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66  )(iOffset & 0xff
f6f0: 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41  ffffff);..  /* A
f700: 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75  PI oddity: If su
f710: 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c  ccessful, SetFil
f720: 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72  ePointer() retur
f730: 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a  ns a dword .  **
f740: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f750: 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
f760: 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
f770: 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
f780: 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
f790: 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
f7a0: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
f7b0: 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
f7c0: 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a  ng to MSDN, .  *
f7d0: 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
f7e0: 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
f7f0: 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
f800: 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
f810: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
f820: 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
f830: 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
f840: 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61  ccurred, it is a
f850: 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f  lso necessary to
f860: 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c   call .  ** GetL
f870: 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f  astError()..  */
f880: 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74  .  dwRet = osSet
f890: 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c  FilePointer(pFil
f8a0: 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  e->h, lowerBits,
f8b0: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
f8c0: 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
f8d0: 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44   (dwRet==INVALID
f8e0: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
f8f0: 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73  R.      && ((las
f900: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
f910: 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45  stError())!=NO_E
f920: 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46  RROR)) ){.    pF
f930: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
f940: 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
f950: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
f960: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70  TE_IOERR_SEEK, p
f970: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
f980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73  .             "s
f990: 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69  eekWinFile", pFi
f9a0: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
f9b0: 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
f9c0: 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
f9d0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c  E_IOERR_SEEK\n",
f9e0: 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
f9f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
fa00: 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
fa10: 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
fa20: 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
fa30: 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
fa40: 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  0;.#else.  /*.  
fa50: 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65  ** Same as above
fa60: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
fa70: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
fa80: 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52  n works for WinR
fa90: 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45  T..  */..  LARGE
faa0: 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20  _INTEGER x;     
fab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fac0: 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  e new offset */.
fad0: 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20    BOOL bRet;    
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
fb00: 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
fb10: 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20  interEx() */..  
fb20: 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66  x.QuadPart = iOf
fb30: 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f  fset;.  bRet = o
fb40: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
fb50: 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30  x(pFile->h, x, 0
fb60: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
fb70: 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20    if(!bRet){.   
fb80: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
fb90: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
fba0: 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
fbb0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
fbc0: 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
fbd0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
fbe0: 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e          "seekWin
fbf0: 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
fc00: 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
fc10: 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
fc20: 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
fc30: 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
fc40: 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
fc50: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
fc60: 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
fc70: 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
fc80: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
fc90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
fca0: 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
fcb0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
fcc0: 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
fcd0: 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
fce0: 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
fcf0: 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c   int winUnmapfil
fd00: 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e  e(winFile*);.#en
fd10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
fd20: 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49   a file..**.** I
fd30: 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68  t is reported th
fd40: 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  at an attempt to
fd50: 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   close a handle 
fd60: 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a  might sometimes.
fd70: 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69  ** fail.  This i
fd80: 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f  s a very unreaso
fd90: 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75  nable result, bu
fda0: 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74  t Windows is not
fdb0: 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65  orious.** for be
fdc0: 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ing unreasonable
fdd0: 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75   so I do not dou
fde0: 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  bt that it might
fdf0: 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20   happen.  If.** 
fe00: 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c  the close fails,
fe10: 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30   we pause for 10
fe20: 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
fe30: 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41  nd try again.  A
fe40: 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f  s.** many as MX_
fe50: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74  CLOSE_ATTEMPT at
fe60: 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20  tempts to close 
fe70: 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d  the handle are m
fe80: 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69  ade before.** gi
fe90: 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75  ving up and retu
fea0: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
feb0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c  */.#define MX_CL
fec0: 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74  OSE_ATTEMPT 3.st
fed0: 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73  atic int winClos
fee0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
fef0: 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63  id){.  int rc, c
ff00: 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c  nt = 0;.  winFil
ff10: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
ff20: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
ff30: 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66  rt( id!=0 );.#if
ff40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ff50: 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70  _WAL.  assert( p
ff60: 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  File->pShm==0 );
ff70: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
ff80: 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c  ( pFile->h!=NULL
ff90: 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e   && pFile->h!=IN
ffa0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
ffb0: 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  UE );.  OSTRACE(
ffc0: 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 5c  ("CLOSE file=%p\
ffd0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
ffe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
fff0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 72 63  MMAP_SIZE>0.  rc
10000 20 3d 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28   = winUnmapfile(
10010 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
10020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
10030 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
10040 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
10050 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
10060 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
10070 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10080 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
10090 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
100a0 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
100b0 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
100c0 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
100d0 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  & (sqlite3_win32
100e0 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  _sleep(100), 1) 
100f0 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
10100 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57  _WINCE.#define W
10110 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
10120 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65  TEMPTS 3.  wince
10130 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c  DestroyLock(pFil
10140 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e);.  if( pFile-
10150 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
10160 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
10170 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20   0;.    while(. 
10180 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65            osDele
10190 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a  teFileW(pFile->z
101a0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d  DeleteOnClose)==
101b0 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73 47  0.        && osG
101c0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
101d0 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
101e0 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66  OnClose)!=0xffff
101f0 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 26 26  ffff .        &&
10200 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44   cnt++ < WINCE_D
10210 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
10220 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
10230 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
10240 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69  ep(100);  /* Wai
10250 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72  t a little befor
10260 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a  e trying again *
10270 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
10280 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
10290 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
102a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
102b0 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
102c0 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  e->h = NULL;.  }
102d0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
102e0 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  1);.  OSTRACE(("
102f0 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c 20 72  CLOSE file=%p, r
10300 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
10310 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
10320 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
10330 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
10340 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  OK.            :
10350 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
10360 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
10370 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10380 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
103a0 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e  nClose", pFile->
103b0 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
103c0 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
103d0 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
103e0 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
103f0 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
10400 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
10410 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
10420 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
10430 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
10440 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
10450 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64  atic int winRead
10460 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
10470 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
10480 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66  * File to read f
10490 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  rom */.  void *p
104a0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
104b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e      /* Write con
104c0 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62  tent into this b
104d0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  uffer */.  int a
104e0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
104f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10500 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
10510 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
10520 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
10530 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
10540 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74  g at this offset
10550 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49   */.){.#if !SQLI
10560 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f 56  TE_OS_WINCE.  OV
10570 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
10580 70 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ped;          /*
10590 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
105a0 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e  ReadFile. */.#en
105b0 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
105c0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
105d0 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61  )id;  /* file ha
105e0 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  ndle */.  DWORD 
105f0 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
10600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10610 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
10620 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
10630 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  file */.  int nR
10640 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
10650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10660 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f  ber of retrys */
10670 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
10680 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
10690 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
106a0 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
106b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
106c0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
106d0 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53  OERR_READ);.  OS
106e0 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
106f0 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
10700 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73   amount=%d, offs
10710 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  et=%lld, lock=%d
10720 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10730 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
10740 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69  amt, offset, pFi
10750 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
10760 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10770 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
10780 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
10790 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
107a0 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
107b0 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
107c0 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
107d0 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
107e0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
107f0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
10800 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
10810 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
10820 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
10830 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
10840 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
10850 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
10860 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
10870 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
10880 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
10890 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c 65 3d  "READ-MMAP file=
108a0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
108b0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
108c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
108d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
108e0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
108f0 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
10900 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
10910 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
10920 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
10930 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
10940 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
10950 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
10960 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
10970 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
10980 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
10990 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
109a0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
109b0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
109c0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
109d0 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  ( seekWinFile(pF
109e0 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
109f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
10a00 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
10a10 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70  QLITE_FULL\n", p
10a20 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
10a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
10a40 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  L;.  }.  while( 
10a50 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
10a60 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
10a70 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23   &nRead, 0) ){.#
10a80 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f  else.  memset(&o
10a90 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
10aa0 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
10ab0 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
10ac0 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
10ad0 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
10ae0 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  fff);.  overlapp
10af0 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
10b00 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
10b10 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
10b20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52  );.  while( !osR
10b30 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
10b40 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
10b50 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ead, &overlapped
10b60 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73  ) &&.         os
10b70 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
10b80 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46  ERROR_HANDLE_EOF
10b90 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44   ){.#endif.    D
10ba0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
10bb0 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65      if( retryIoe
10bc0 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
10bd0 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
10be0 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ue;.    pFile->l
10bf0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
10c00 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
10c10 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
10c20 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
10c30 52 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65  R_READ\n", pFile
10c40 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
10c50 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
10c60 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c  LITE_IOERR_READ,
10c70 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10c80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
10c90 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
10ca0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
10cb0 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  logIoerr(nRetry)
10cc0 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
10cd0 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
10ce0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
10cf0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
10d00 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
10d10 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
10d20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
10d30 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
10d40 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ead);.    OSTRAC
10d50 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
10d60 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
10d70 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c  R_SHORT_READ\n",
10d80 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
10d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
10da0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
10db0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
10dc0 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
10dd0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
10de0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
10df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
10e10 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
10e20 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
10e30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10e40 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
10e50 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
10e60 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
10e70 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
10e80 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
10e90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10eb0 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
10ec0 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
10ed0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
10ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10ef0 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69   bytes to be wri
10f00 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  tten */.  int am
10f10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
10f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10f30 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
10f40 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
10f50 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
10f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10f70 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
10f80 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  le to begin writ
10f90 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69  ing at */.){.  i
10fa0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10fc0 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20  * True if error 
10fd0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c  has occurred, el
10fe0 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69  se false */.  wi
10ff0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
11000 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
11010 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   File handle */.
11020 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
11030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11040 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
11050 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73  etries */..  ass
11060 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
11070 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11080 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
11090 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
110a0 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20  _IOERR_WRITE);. 
110b0 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
110c0 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  lError(return SQ
110d0 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f  LITE_FULL);..  O
110e0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
110f0 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25  ile=%p, buffer=%
11100 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66  p, amount=%d, of
11110 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d  fset=%lld, lock=
11120 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11130 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66    pFile->h, pBuf
11140 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70  , amt, offset, p
11150 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
11160 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
11170 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11180 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
11190 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72 69  much of this wri
111a0 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  te request as po
111b0 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
111c0 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
111d0 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
111e0 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
111f0 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
11200 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
11210 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
11220 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
11230 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
11240 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
11250 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
11260 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
11270 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d  ffset], pBuf, am
11280 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  t);.      OSTRAC
11290 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 66  E(("WRITE-MMAP f
112a0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
112b0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
112c0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
112d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
112e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
112f0 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
11300 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
11310 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
11320 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
11330 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
11340 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
11350 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
11360 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
11370 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
11380 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
11390 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
113a0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
113b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
113c0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
113d0 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69    rc = seekWinFi
113e0 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
113f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
11400 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64  {.#else.  {.#end
11410 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
11420 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52  S_WINCE.    OVER
11430 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65  LAPPED overlappe
11440 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d;        /* The
11450 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74   offset for Writ
11460 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66  eFile. */.#endif
11470 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20  .    u8 *aRem = 
11480 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20  (u8 *)pBuf;     
11490 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74     /* Data yet t
114a0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
114b0 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61      int nRem = a
114c0 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
114d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
114e0 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77  ytes yet to be w
114f0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57  ritten */.    DW
11500 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ORD nWrite;     
11510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
11520 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
11530 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29  each WriteFile()
11540 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f   call */.    DWO
11550 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  RD lastErrno = N
11560 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61  O_ERROR;   /* Va
11570 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
11580 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a  GetLastError() *
11590 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  /..#if !SQLITE_O
115a0 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73  S_WINCE.    mems
115b0 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20  et(&overlapped, 
115c0 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
115d0 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72  PPED));.    over
115e0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
115f0 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
11600 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0xffffffff);.   
11610 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
11620 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
11630 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
11640 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
11650 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e  if..    while( n
11660 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c  Rem>0 ){.#if SQL
11670 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
11680 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
11690 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
116a0 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
116b0 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20  e, 0) ){.#else. 
116c0 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74       if( !osWrit
116d0 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eFile(pFile->h, 
116e0 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72  aRem, nRem, &nWr
116f0 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ite, &overlapped
11700 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ) ){.#endif.    
11710 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65      if( retryIoe
11720 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
11730 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
11740 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ue;.        brea
11750 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11760 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
11770 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44  =0 || nWrite<=(D
11780 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20  WORD)nRem );.   
11790 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30     if( nWrite==0
117a0 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52   || nWrite>(DWOR
117b0 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  D)nRem ){.      
117c0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
117d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
117e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
117f0 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49       }.#if !SQLI
11800 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
11810 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69    offset += nWri
11820 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  te;.      overla
11830 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
11840 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
11850 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  ffffffff);.     
11860 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
11870 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
11880 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
11890 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
118a0 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  if.      aRem +=
118b0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
118c0 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
118d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
118e0 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
118f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11900 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
11910 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
11920 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
11930 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c      if(   ( pFil
11940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
11950 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f  ROR_HANDLE_DISK_
11960 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c  FULL ).       ||
11970 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
11980 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f  rno==ERROR_DISK_
11990 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f  FULL )){.      O
119a0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
119b0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
119c0 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65  E_FULL\n", pFile
119d0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
119e0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
119f0 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41  .    }.    OSTRA
11a00 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d  CE(("WRITE file=
11a10 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
11a20 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46  ERR_WRITE\n", pF
11a30 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
11a40 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
11a50 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  (SQLITE_IOERR_WR
11a60 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ITE, pFile->last
11a70 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
11a80 20 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c 20      "winWrite", 
11a90 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
11aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49   }else{.    logI
11ab0 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20  oerr(nRetry);.  
11ac0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  }.  OSTRACE(("WR
11ad0 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ITE file=%p, rc=
11ae0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
11af0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
11b00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11b10 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
11b20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
11b30 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
11b40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11b50 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
11b60 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
11b70 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
11b80 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
11b90 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
11ba0 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
11bb0 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
11bc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11bd0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
11be0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
11bf0 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
11c00 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
11c10 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  Errno;..  assert
11c20 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
11c30 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
11c40 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11c50 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53  _TRUNCATE);.  OS
11c60 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
11c70 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25   file=%p, size=%
11c80 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  lld, lock=%d\n",
11c90 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
11ca0 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69  e->h, nByte, pFi
11cb0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
11cc0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
11cd0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
11ce0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
11cf0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
11d00 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
11d10 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
11d20 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
11d30 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
11d40 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
11d50 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
11d60 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
11d70 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
11d80 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
11d90 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
11da0 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
11db0 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
11dc0 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
11dd0 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
11de0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
11df0 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
11e00 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
11e10 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  k;.  }..  /* Set
11e20 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75  EndOfFile() retu
11e30 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65  rns non-zero whe
11e40 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  n successful, or
11e50 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61   zero when it fa
11e60 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65  ils. */.  if( se
11e70 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c  ekWinFile(pFile,
11e80 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72   nByte) ){.    r
11e90 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
11ea0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
11eb0 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  NCATE, pFile->la
11ec0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
11ee0 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46  inTruncate1", pF
11ef0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
11f00 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65  else if( 0==osSe
11f10 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65  tEndOfFile(pFile
11f20 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20  ->h) &&.        
11f30 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20      ((lastErrno 
11f40 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11f50 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f  ())!=ERROR_USER_
11f60 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a  MAPPED_FILE) ){.
11f70 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11f80 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
11f90 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
11fa0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11fb0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
11fc0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
11ff0 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
12000 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  h);.  }..#if SQL
12010 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
12020 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  E>0.  /* If the 
12030 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74  file was truncat
12040 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
12050 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
12060 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70  rrently.  ** map
12070 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
12080 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
12090 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
120a0 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
120b0 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64  ll.  ** use read
120c0 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
120d0 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
120e0 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
120f0 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a  from now on..  *
12100 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
12110 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79  MapRegion && nBy
12120 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  te<pFile->mmapSi
12130 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ze ){.    pFile-
12140 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
12150 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
12160 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
12170 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ATE file=%p, rc=
12180 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
12190 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
121a0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
121b0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
121c0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
121d0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
121e0 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
121f0 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
12200 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
12210 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
12220 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
12230 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
12240 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
12250 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
12260 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
12270 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
12280 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
12290 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
122a0 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
122b0 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
122c0 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
122d0 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
122e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
122f0 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
12300 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
12310 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  gs){.#ifndef SQL
12320 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a  ITE_NO_SYNC.  /*
12330 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  ** Used only 
12340 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
12350 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
12360 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c  ed..   */.  BOOL
12370 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
12380 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
12390 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
123a0 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20  ITE_NO_SYNC) || 
123b0 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53  \.    (defined(S
123c0 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64  QLITE_TEST) && d
123d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
123e0 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  BUG)).  /*.  ** 
123f0 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  Used when SQLITE
12400 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
12410 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74  defined and by t
12420 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f  he assert() and/
12430 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28  or.  ** OSTRACE(
12440 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a  ) macros..   */.
12450 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12460 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
12470 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
12480 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
12490 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
124a0 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
124b0 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
124c0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
124d0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
124e0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
124f0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
12500 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
12510 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
12520 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
12530 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
12540 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
12550 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
12560 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
12570 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
12580 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
12590 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
125a0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
125b0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
125c0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
125d0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
125e0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
125f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
12600 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
12610 43 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73  C file=%p, flags
12620 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%x, lock=%d\n",
12630 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
12640 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46 69  e->h, flags, pFi
12650 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
12660 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12670 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41  TEST.  UNUSED_PA
12680 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
12690 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61  #else.  if( (fla
126a0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
126b0 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20  _SYNC_FULL ){.  
126c0 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79    sqlite3_fullsy
126d0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a  nc_count++;.  }.
126e0 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
126f0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
12700 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
12710 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
12720 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
12730 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
12740 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
12750 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
12760 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75  E_NO_SYNC.  retu
12770 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
12780 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75  lse.  rc = osFlu
12790 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
127a0 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c  ile->h);.  Simul
127b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46  ateIOError( rc=F
127c0 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63  ALSE );.  if( rc
127d0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
127e0 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20  ("SYNC file=%p, 
127f0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
12800 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
12810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12820 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
12830 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12840 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12850 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  r();.    OSTRACE
12860 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
12870 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
12880 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c 65  _FSYNC\n", pFile
12890 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
128a0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
128b0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
128c0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
128d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
128e0 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
128f0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
12900 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
12910 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
12920 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
12930 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
12940 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
12950 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
12960 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
12970 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
12980 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12990 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
129a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
129b0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
129c0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
129d0 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b  ert( pSize!=0 );
129e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
129f0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
12a00 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
12a10 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
12a20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
12a30 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
12a40 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51  pSize));..#if SQ
12a50 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
12a60 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44  {.    FILE_STAND
12a70 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20  ARD_INFO info;. 
12a80 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65     if( osGetFile
12a90 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
12aa0 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  dleEx(pFile->h, 
12ab0 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f  FileStandardInfo
12ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69         &info, si
12af0 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20  zeof(info)) ){. 
12b00 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e       *pSize = in
12b10 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61  fo.EndOfFile.Qua
12b20 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  dPart;.    }else
12b30 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
12b40 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
12b50 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
12b60 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
12b70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12b80 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
12b90 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
12ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12bb0 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
12bc0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
12bd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
12be0 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70   {.    DWORD upp
12bf0 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
12c00 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  D lowerBits;.   
12c10 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
12c20 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73  ;..    lowerBits
12c30 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65   = osGetFileSize
12c40 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65  (pFile->h, &uppe
12c50 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69  rBits);.    *pSi
12c60 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
12c70 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
12c80 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
12c90 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f  s;.    if(   (lo
12ca0 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c  werBits == INVAL
12cb0 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20  ID_FILE_SIZE).  
12cc0 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
12cd0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
12ce0 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
12cf0 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  R) ){.      pFil
12d00 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
12d10 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
12d20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
12d30 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
12d40 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
12d50 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
12d60 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65      "winFileSize
12d70 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
12d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
12d90 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  if.  OSTRACE(("S
12da0 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
12db0 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c  ze=%p, *pSize=%l
12dc0 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  ld, rc=%s\n",.  
12dd0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12de0 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65  h, pSize, *pSize
12df0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
12e00 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
12e10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f   rc;.}../*.** LO
12e20 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
12e30 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66  DIATELY is undef
12e40 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e  ined on some Win
12e50 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dows systems..*/
12e60 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
12e70 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
12e80 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  LY.# define LOCK
12e90 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
12ea0 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a  ATELY 1.#endif..
12eb0 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
12ec0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a  _EXCLUSIVE_LOCK.
12ed0 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
12ee0 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
12ef0 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   2.#endif../*.**
12f00 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53   Historically, S
12f10 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62  QLite has used b
12f20 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  oth the LockFile
12f30 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20   and LockFileEx 
12f40 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68  functions..** Wh
12f50 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  en the LockFile 
12f60 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65  function was use
12f70 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73  d, it was always
12f80 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69   expected to fai
12f90 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  l.** immediately
12fa0 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75   if the lock cou
12fb0 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  ld not be obtain
12fc0 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c  ed.  Also, it al
12fd0 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
12fe0 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78  .** obtain an ex
12ff0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54  clusive lock.  T
13000 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75  hese flags are u
13010 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63  sed with the Loc
13020 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
13030 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20  .** and reflect 
13040 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f  those expectatio
13050 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74  ns; therefore, t
13060 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  hey should not b
13070 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69  e changed..*/.#i
13080 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
13090 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65  KFILE_FLAGS.# de
130a0 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
130b0 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f  FILE_FLAGS   (LO
130c0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
130d0 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20  DIATELY | \.    
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f                LO
13100 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
13110 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f  _LOCK).#endif../
13120 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20  *.** Currently, 
13130 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c  SQLite never cal
13140 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ls the LockFileE
13150 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f  x function witho
13160 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a  ut wanting the.*
13170 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69  * call to fail i
13180 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
13190 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
131a0 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69   obtained..*/.#i
131b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
131c0 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20  KFILEEX_FLAGS.# 
131d0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f  define SQLITE_LO
131e0 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28  CKFILEEX_FLAGS (
131f0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
13200 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69  MEDIATELY).#endi
13210 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
13220 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
13230 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
13240 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
13250 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
13260 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
13270 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
13280 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  x or WinNT..*/.s
13290 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
132a0 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
132b0 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
132c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
132d0 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  AD-LOCK file=%p,
132e0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
132f0 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
13300 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20  cktype));.  if( 
13310 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
13320 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13330 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
13340 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
13350 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
13360 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
13370 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
13380 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
13390 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
133a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
133b0 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
133c0 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
133d0 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
133e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
133f0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
13400 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
13410 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
13420 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
13430 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
13440 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
13450 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
13460 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
13470 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
13480 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
13490 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
134a0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
134b0 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
134c0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
134d0 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
134e0 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
134f0 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
13500 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
13510 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
13520 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
13530 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
13540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13550 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
13560 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
13570 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
13580 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
13590 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
135a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
135b0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
135c0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
135d0 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
135e0 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
135f0 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52  ck */.  }.  OSTR
13600 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
13610 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
13620 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
13630 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29  ite3ErrName(res)
13640 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
13650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20  ;.}../*.** Undo 
13660 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74  a readlock.*/.st
13670 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52  atic int unlockR
13680 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
13690 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
136a0 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  es;.  DWORD last
136b0 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45  Errno;.  OSTRACE
136c0 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
136d0 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c  ile=%p, lock=%d\
136e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
136f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
13700 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
13710 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
13720 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
13730 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
13740 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
13750 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  , 0);.  }.#ifdef
13760 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
13770 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
13780 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
13790 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
137a0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  , SHARED_FIRST+p
137b0 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
137c0 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
137d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
137e0 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73   res==0 && ((las
137f0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13800 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
13810 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b  R_NOT_LOCKED) ){
13820 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
13830 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
13840 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
13850 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
13860 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c  UNLOCK, pFile->l
13870 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
13880 20 20 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52 65         "unlockRe
13890 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  adLock", pFile->
138a0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53  zPath);.  }.  OS
138b0 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c  TRACE(("READ-UNL
138c0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
138d0 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
138e0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
138f0 72 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  res)));.  return
13900 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   res;.}../*.** L
13910 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
13920 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
13930 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
13940 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
13950 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
13960 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
13970 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
13980 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
13990 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
139a0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
139b0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
139c0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
139d0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
139e0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
139f0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
13a00 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
13a10 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
13a20 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
13a30 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
13a40 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
13a50 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
13a60 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
13a70 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
13a80 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
13a90 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
13aa0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
13ab0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
13ac0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
13ad0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
13ae0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
13af0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
13b00 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
13b10 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
13b20 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
13b30 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
13b40 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
13b50 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13b60 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
13b70 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
13b80 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
13b90 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13ba0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
13bb0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
13bc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
13bd0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
13be0 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69   a lock.  The wi
13bf0 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  nUnlock() routin
13c00 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20  e.** erases all 
13c10 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e  locks at once an
13c20 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d  d returns us imm
13c30 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b  ediately to lock
13c40 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20  ing level 0..** 
13c50 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
13c60 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20  le to lower the 
13c70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
13c80 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65  e step at a time
13c90 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67  .  You.** must g
13ca0 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f  o straight to lo
13cb0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
13cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13cd0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13ce0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
13cf0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
13d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
13d10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
13d20 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
13d30 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
13d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13d50 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77  sult of a Window
13d60 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20  s lock call */. 
13d70 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65   int newLocktype
13d80 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ;       /* Set p
13d90 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74  File->locktype t
13da0 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66  o this value bef
13db0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
13dc0 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
13dd0 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20  ock = 0;/* True 
13de0 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61  if we acquired a
13df0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
13e00 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e  is time */.  win
13e10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
13e20 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57  inFile*)id;.  DW
13e30 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
13e40 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73  NO_ERROR;..  ass
13e50 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
13e60 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66  OSTRACE(("LOCK f
13e70 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d  ile=%p, oldLock=
13e80 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d  %d(%d), newLock=
13e90 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
13ea0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
13eb0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
13ec0 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
13ed0 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  te, locktype));.
13ee0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
13ef0 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
13f00 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
13f10 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
13f20 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73  e on the.  ** Os
13f30 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
13f40 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
13f50 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
13f60 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c  ath, as.  ** sql
13f70 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
13f80 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
13f90 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
13fa0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
13fb0 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
13fc0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
13fd0 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d  "LOCK-HELD file=
13fe0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
13ff0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14000 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14010 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
14020 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
14030 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
14040 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a  is correct.  */.
14050 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
14060 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f  >locktype!=NO_LO
14070 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK || locktype==
14080 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
14090 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
140a0 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e!=PENDING_LOCK 
140b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
140c0 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f  ktype!=RESERVED_
140d0 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c  LOCK || pFile->l
140e0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
140f0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  LOCK );..  /* Lo
14100 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ck the PENDING_L
14110 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e  OCK byte if we n
14120 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61  eed to acquire a
14130 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72   PENDING lock or
14140 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c  .  ** a SHARED l
14150 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20  ock.  If we are 
14160 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52  acquiring a SHAR
14170 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71  ED lock, the acq
14180 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a  uisition of.  **
14190 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
141a0 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72  K byte is tempor
141b0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c  ary..  */.  newL
141c0 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  ocktype = pFile-
141d0 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
141e0 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74     (pFile->lockt
141f0 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20  ype==NO_LOCK).  
14200 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74     || (   (lockt
14210 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
14220 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26  OCK).         &&
14230 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
14240 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
14250 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  )).  ){.    int 
14260 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
14270 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
14280 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
14290 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
142a0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
142b0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e               PEN
142e0 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
142f0 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
14300 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20   /* Try 3 times 
14310 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69  to get the pendi
14320 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69  ng lock.  This i
14330 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b  s needed to work
14340 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64  .      ** around
14350 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
14360 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64   by indexing and
14370 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73  /or anti-virus s
14380 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20  oftware on.     
14390 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74   ** Windows syst
143a0 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  ems..      ** If
143b0 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74   you are using t
143c0 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f  his code as a mo
143d0 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74  del for alternat
143e0 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f  ive VFSes, do no
143f0 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  t.      ** copy 
14400 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63  this retry logic
14410 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20  .  It is a hack 
14420 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e  intended for Win
14430 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  dows only..     
14440 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
14450 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47  E(("LOCK-PENDING
14460 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63  -FAIL file=%p, c
14470 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  ount=%d, rc=%s\n
14480 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
14490 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c    pFile->h, cnt,
144a0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
144b0 72 65 73 29 29 29 3b 0a 20 20 20 20 20 20 69 66  res)));.      if
144c0 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33 5f  ( cnt ) sqlite3_
144d0 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a  win32_sleep(1);.
144e0 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e      }.    gotPen
144f0 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a  dingLock = res;.
14500 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a      if( !res ){.
14510 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
14520 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
14530 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
14540 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73 68   /* Acquire a sh
14550 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  ared lock.  */. 
14560 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
14570 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  HARED_LOCK && re
14580 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
14590 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
145a0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ==NO_LOCK );.   
145b0 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f   res = getReadLo
145c0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  ck(pFile);.    i
145d0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
145e0 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48  newLocktype = SH
145f0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
14600 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
14610 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
14620 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
14630 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
14640 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
14650 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
14660 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
14670 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
14680 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
14690 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
146a0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
146b0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
146c0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
146d0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
146e0 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
146f0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
14700 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
14710 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
14720 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
14730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
14740 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14750 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14760 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
14770 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
14780 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
14790 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
147a0 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
147b0 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
147c0 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
147d0 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
147e0 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
147f0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
14800 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
14810 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
14820 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
14830 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
14840 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
14850 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  ocktype>=SHARED_
14860 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
14870 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  = unlockReadLock
14880 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73  (pFile);.    res
14890 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
148a0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
148b0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
148c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
148d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
148e0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
148f0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
14900 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
14910 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
14920 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
14930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
14940 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
14950 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
14960 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
14970 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
14980 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
14990 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
149a0 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
149b0 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
149c0 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
149d0 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
149e0 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
149f0 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
14a00 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
14a10 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
14a20 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
14a30 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
14a40 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
14a50 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
14a60 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
14a70 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
14a80 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
14a90 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
14aa0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
14ab0 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
14ac0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
14ad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
14af0 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49  TRACE(("LOCK-FAI
14b00 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65  L file=%p, wante
14b10 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c  d=%d, got=%d\n",
14b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46  .             pF
14b30 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65  ile->h, locktype
14b40 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b  , newLocktype));
14b50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
14b60 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
14b70 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
14b80 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70  TE_BUSY;.  }.  p
14b90 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
14ba0 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65   (u8)newLocktype
14bb0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
14bc0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
14bd0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
14be0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14bf0 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
14c00 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ype, sqlite3ErrN
14c10 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
14c20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
14c40 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
14c50 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
14c60 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
14c70 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
14c80 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
14c90 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
14ca0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14cb0 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e  eld, return.** n
14cc0 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  on-zero, otherwi
14cd0 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  se zero..*/.stat
14ce0 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52  ic int winCheckR
14cf0 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
14d00 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14d10 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
14d20 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65  nt rc;.  winFile
14d30 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
14d40 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
14d50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
14d60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14d70 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
14d80 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  K; );.  OSTRACE(
14d90 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
14da0 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
14db0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
14dc0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61   pResOut));..  a
14dd0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
14de0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
14df0 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
14e00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
14e10 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
14e20 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
14e30 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28 6c  ile=%p, rc=%d (l
14e40 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
14e50 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73  >h, rc));.  }els
14e60 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  e{.    rc = winL
14e70 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14e80 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
14e90 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52  LEEX_FLAGS,RESER
14ea0 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
14eb0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
14ec0 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63  {.      winUnloc
14ed0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
14ee0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
14ef0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 1, 0);.    }.
14f00 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20      rc = !rc;.  
14f10 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
14f20 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  -WR-LOCK file=%p
14f30 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74 65 29  , rc=%d (remote)
14f40 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
14f50 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  c));.  }.  *pRes
14f60 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
14f70 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
14f80 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
14f90 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74  Out=%p, *pResOut
14fa0 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%d, rc=SQLITE_O
14fb0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
14fc0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f   pFile->h, pResO
14fd0 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a  ut, *pResOut));.
14fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ff0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
15000 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
15010 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
15020 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
15030 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
15040 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
15050 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
15060 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
15070 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
15080 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
15090 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
150a0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
150b0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
150c0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
150d0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
150e0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
150f0 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
15100 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
15110 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
15120 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
15130 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
15140 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
15150 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
15160 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
15170 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
15180 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
15190 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
151a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
151b0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
151c0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
151d0 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
151e0 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
151f0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
15200 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
15210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
15220 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
15230 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
15240 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
15250 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
15260 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c  LOCK file=%p, ol
15270 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65  dLock=%d(%d), ne
15280 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20  wLock=%d\n",.   
15290 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
152a0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
152b0 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
152c0 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79  LockByte, lockty
152d0 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70  pe));.  type = p
152e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
152f0 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c    if( type>=EXCL
15300 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
15310 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
15320 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
15330 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
15340 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
15350 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53   if( locktype==S
15360 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67  HARED_LOCK && !g
15370 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
15380 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
15390 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
153a0 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75  happen.  We shou
153b0 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c  ld always be abl
153c0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  e to.      ** re
153d0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
153e0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
153f0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
15400 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
15410 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OCK, osGetLastEr
15420 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
15430 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b        "winUnlock
15440 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
15450 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
15460 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  ( type>=RESERVED
15470 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
15480 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15490 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
154a0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
154b0 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70   }.  if( locktyp
154c0 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79  e==NO_LOCK && ty
154d0 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
154e0 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61  ){.    unlockRea
154f0 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
15500 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
15510 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
15520 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
15530 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
15540 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
15550 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
15560 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c  locktype = (u8)l
15570 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41  ocktype;.  OSTRA
15580 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
15590 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63  =%p, lock=%d, rc
155a0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
155b0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
155c0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71  le->locktype, sq
155d0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
155e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
155f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
15600 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c  rg is inititiall
15610 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
15620 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
15630 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
15640 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
15650 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
15660 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
15670 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
15680 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
15690 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
156a0 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
156b0 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
156c0 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
156d0 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
156e0 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69  c void winModeBi
156f0 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  t(winFile *pFile
15700 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
15710 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
15720 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
15730 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
15740 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
15750 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
15760 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
15770 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
15780 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
15790 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
157a0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
157b0 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
157c0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
157d0 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
157e0 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70  atic int getTemp
157f0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
15800 68 61 72 20 2a 7a 42 75 66 29 3b 0a 23 69 66 20  har *zBuf);.#if 
15810 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
15820 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e  SIZE>0.static in
15830 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
15840 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69  File*, sqlite3_i
15850 6e 74 36 34 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  nt64);.#endif../
15860 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
15870 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
15880 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
15890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
158a0 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
158b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
158c0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
158d0 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
158e0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
158f0 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  )id;.  OSTRACE((
15900 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
15910 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e  op=%d, pArg=%p\n
15920 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c  ", pFile->h, op,
15930 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63   pArg));.  switc
15940 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
15950 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
15960 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20  OCKSTATE: {.    
15970 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20    *(int*)pArg = 
15980 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
15990 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
159a0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
159b0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
159c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
159d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
159e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
159f0 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
15a00 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
15a10 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
15a20 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
15a30 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  no;.      OSTRAC
15a40 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
15a50 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
15a60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
15a70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15a80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
15a90 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
15aa0 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20  NTL_CHUNK_SIZE: 
15ab0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
15ac0 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a  zChunk = *(int *
15ad0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54  )pArg;.      OST
15ae0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
15af0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15b00 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
15b10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15b20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15b30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15b40 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
15b50 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46  : {.      if( pF
15b60 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
15b70 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15b80 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20  3_int64 oldSz;. 
15b90 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
15ba0 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20  winFileSize(id, 
15bb0 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20  &oldSz);.       
15bc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15be0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65  sqlite3_int64 ne
15bf0 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f  wSz = *(sqlite3_
15c00 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  int64*)pArg;.   
15c10 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a         if( newSz
15c20 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20  >oldSz ){.      
15c30 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
15c40 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
15c50 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15c60 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c   winTruncate(id,
15c70 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20   newSz);.       
15c80 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
15c90 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
15ca0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15cb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54     }.        OST
15cc0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
15cd0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
15ce0 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
15cf0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
15d00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15d10 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
15d20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
15d30 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15d40 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15d50 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
15d60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15d70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
15d80 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
15d90 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
15da0 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
15db0 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
15dc0 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
15dd0 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
15de0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
15df0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
15e00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
15e10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15e20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
15e30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
15e40 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
15e50 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
15e60 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
15e70 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
15e80 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
15e90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
15ea0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
15eb0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
15ec0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
15ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15ef0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
15f00 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
15f10 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
15f20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
15f30 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 4f  win32");.      O
15f40 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
15f50 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15f60 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
15f70 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
15f80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
15f90 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
15fa0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
15fb0 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20  V_RETRY: {.     
15fc0 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29   int *a = (int*)
15fd0 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  pArg;.      if( 
15fe0 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20  a[0]>0 ){.      
15ff0 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72    win32IoerrRetr
16000 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  y = a[0];.      
16010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
16020 5b 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72  [0] = win32Ioerr
16030 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Retry;.      }. 
16040 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20       if( a[1]>0 
16050 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32  ){.        win32
16060 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
16070 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[1];.      }e
16080 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31  lse{.        a[1
16090 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65  ] = win32IoerrRe
160a0 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20  tryDelay;.      
160b0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
160c0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
160d0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
160e0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
160f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16100 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
16110 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
16120 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
16130 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
16140 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  File = sqlite3Ma
16150 6c 6c 6f 63 5a 65 72 6f 28 20 70 46 69 6c 65 2d  llocZero( pFile-
16160 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
16170 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  e );.      if( z
16180 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  TFile ){.       
16190 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69   getTempname(pFi
161a0 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
161b0 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20  name, zTFile);. 
161c0 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
161d0 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
161e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
161f0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
16200 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
16210 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
16220 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
16240 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
16250 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
16260 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
16270 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
16280 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
16290 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
162a0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
162b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
162c0 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
162d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
162e0 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
162f0 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
16300 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16310 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
16320 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29   }.      *(i64*)
16330 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  pArg = pFile->mm
16340 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20  apSizeMax;.     
16350 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
16360 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46   && newLimit!=pF
16370 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
16380 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63   && pFile->nFetc
16390 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  hOut==0 ){.     
163a0 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
163b0 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74  zeMax = newLimit
163c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
163d0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20  ile->mmapSize>0 
163e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  ){.          (vo
163f0 69 64 29 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  id)winUnmapfile(
16400 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
16410 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c    rc = winMapfil
16420 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  e(pFile, -1);.  
16430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
16440 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16450 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
16460 63 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%d\n", pFile->
16470 68 2c 20 72 63 29 29 3b 0a 20 20 20 20 20 20 72  h, rc));.      r
16480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16490 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54  #endif.  }.  OST
164a0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
164b0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
164c0 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69  NOTFOUND\n", pFi
164d0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
164e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
164f0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
16500 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
16510 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
16520 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
16530 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
16540 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
16550 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
16560 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
16570 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
16580 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
16590 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
165a0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
165b0 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
165c0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
165d0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
165e0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
165f0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
16600 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
16610 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
16620 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
16630 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
16640 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
16650 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
16660 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
16670 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
16680 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
16690 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
166a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
166b0 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20  {.  (void)id;.  
166c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
166d0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
166e0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
166f0 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64  rn a vector of d
16700 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
16710 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stics..*/.static
16720 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68   int winDeviceCh
16730 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
16740 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
16750 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20  .  winFile *p = 
16760 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
16770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
16780 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
16790 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20  WHEN_OPEN |.    
167a0 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c       ((p->ctrlFl
167b0 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53  ags & WINFILE_PS
167c0 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50  OW)?SQLITE_IOCAP
167d0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
167e0 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a  RITE:0);.}../* .
167f0 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20  ** Windows will 
16800 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65  only let you cre
16810 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61  ate file view ma
16820 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c  ppings.** on all
16830 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61  ocation size gra
16840 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72  nularity boundar
16850 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73  ies..** During s
16860 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29  qlite3_os_init()
16870 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74   we do a GetSyst
16880 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67  emInfo().** to g
16890 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69  et the granulari
168a0 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54  ty size..*/.SYST
168b0 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e  EM_INFO winSysIn
168c0 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  fo;..#ifndef SQL
168d0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
168e0 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
168f0 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
16900 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
16910 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
16920 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
16930 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
16940 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f  rotect the winLo
16950 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75  ckInfo objects u
16960 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20  sed by .** this 
16970 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69  file, all of whi
16980 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65 64  ch may be shared
16990 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
169a0 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63  eads..**.** Func
169b0 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78  tion winShmMutex
169c0 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20 74  Held() is used t
169d0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
169e0 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
169f0 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65   .** is held whe
16a00 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
16a10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
16a20 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
16a30 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  f assert() .** s
16a40 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
16a50 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
16a60 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
16a70 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
16a80 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
16a90 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
16aa0 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
16ab0 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
16ac0 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
16ad0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16ae0 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
16af0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
16b00 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
16b10 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
16b20 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
16b30 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
16b40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16b50 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
16b60 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
16b70 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
16b80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
16b90 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
16ba0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
16bb0 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72  (void) {.  retur
16bc0 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
16bd0 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65  held(sqlite3Mute
16be0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
16bf0 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
16c00 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  R));.}.#endif../
16c10 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
16c20 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
16c30 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
16c40 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
16c50 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
16c60 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
16c70 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
16c80 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
16c90 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
16ca0 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
16cb0 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
16cc0 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
16cd0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
16ce0 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
16cf0 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
16d00 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
16d10 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
16d20 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
16d30 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
16d40 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
16d50 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
16d60 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
16d70 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
16d80 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
16d90 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
16da0 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
16db0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
16dc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
16dd0 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
16de0 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
16df0 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  xt .**.** The fo
16e00 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
16e10 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
16e20 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
16e30 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
16e40 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
16e50 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
16e60 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e  * Either winShmN
16e70 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
16e80 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d  e held or winShm
16e90 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
16ea0 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
16eb0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
16ec0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
16ed0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
16ee0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
16ef0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
16f00 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  /.struct winShmN
16f10 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode {.  sqlite3_
16f20 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
16f30 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
16f40 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
16f50 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
16f60 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
16f70 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
16f80 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69   file */.  winFi
16f90 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20  le hFile;       
16fa0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
16fb0 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65  ndle from winOpe
16fc0 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65  n */..  int szRe
16fd0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
16fe0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
16ff0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
17000 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
17010 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
17020 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
17030 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
17040 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
17050 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
17060 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
17070 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
17080 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
17090 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
170a0 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
170b0 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
170c0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
170d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
170e0 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
170f0 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
17100 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
17110 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
17120 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17130 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
17140 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
17150 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
17160 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
17170 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
17180 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
17190 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
171a0 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
171b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
171c0 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
171d0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
171e0 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ts */.#ifdef SQL
171f0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e  ITE_DEBUG.  u8 n
17200 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
17210 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
17220 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e  vailable winShm.
17230 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
17240 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  if.};../*.** A g
17250 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61  lobal array of a
17260 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
17270 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  jects..**.** The
17280 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
17290 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
172a0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
172b0 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69   writing this li
172c0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69  st..*/.static wi
172d0 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d  nShmNode *winShm
172e0 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  NodeList = 0;../
172f0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
17300 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
17310 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
17320 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
17330 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
17340 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
17350 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
17360 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
17370 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
17380 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
17390 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
173a0 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
173b0 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
173c0 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70  *.**    winShm.p
173d0 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69  ShmNode.**    wi
173e0 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  nShm.id.**.** Al
173f0 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
17400 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
17410 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e  The winShm.pShmN
17420 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ode->mutex must 
17430 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
17440 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
17450 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
17460 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  ..*/.struct winS
17470 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  hm {.  winShmNod
17480 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
17490 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
174a0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  ing winShmNode o
174b0 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68  bject */.  winSh
174c0 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
174d0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69        /* Next wi
174e0 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  nShm with the sa
174f0 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  me winShmNode */
17500 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17520 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
17530 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
17540 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
17550 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
17560 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
17570 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
17580 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
17590 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
175a0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
175b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
175c0 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ld */.#ifdef SQL
175d0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69  ITE_DEBUG.  u8 i
175e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
175f0 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
17600 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
17610 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
17620 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
17630 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
17640 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
17650 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
17660 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
17670 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
17680 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
17690 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
176a0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
176b0 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
176c0 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
176d0 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
176e0 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
176f0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
17700 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
17710 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
17720 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
17730 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f  */.#define _SHM_
17740 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
17750 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23   _SHM_RDLCK  2.#
17760 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
17770 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  K  3.static int 
17780 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
17790 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  (.  winShmNode *
177a0 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70  pFile,    /* App
177b0 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
177c0 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
177d0 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
177e0 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
177f0 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55         /* _SHM_U
17800 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  NLCK, _SHM_RDLCK
17810 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  , or _SHM_WRLCK 
17820 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
17830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
17840 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
17850 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
17860 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
17870 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
17880 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17890 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
178a0 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
178b0 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
178c0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
178d0 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f   code form Lock/
178e0 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a  UnlockFileEx() *
178f0 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
17900 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  o the winShmNode
17910 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
17920 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
17930 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
17940 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17950 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
17960 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66  ) || pFile->nRef
17970 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ==0 );..  OSTRAC
17980 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c  E(("SHM-LOCK fil
17990 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f  e=%p, lock=%d, o
179a0 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
179b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
179c0 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
179d0 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c   lockType, ofst,
179e0 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20   nByte));..  /* 
179f0 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
17a00 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
17a10 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
17a20 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
17a30 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
17a40 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17a50 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f  File->hFile.h, o
17a60 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
17a70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17a80 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
17a90 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
17aa0 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52  ters */.    DWOR
17ab0 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b  D dwFlags = LOCK
17ac0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
17ad0 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c  ATELY;.    if( l
17ae0 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
17af0 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20  WRLCK ) dwFlags 
17b00 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  |= LOCKFILE_EXCL
17b10 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
17b20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  rc = winLockFile
17b30 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
17b40 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c  , dwFlags, ofst,
17b50 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
17b60 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d   }.  .  if( rc!=
17b70 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53   0 ){.    rc = S
17b80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
17b90 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
17ba0 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74  stErrno =  osGet
17bb0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
17bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17bd0 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  Y;.  }..  OSTRAC
17be0 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c  E(("SHM-LOCK fil
17bf0 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65  e=%p, func=%s, e
17c00 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c  rrno=%lu, rc=%s\
17c10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
17c20 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28  File->hFile.h, (
17c30 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
17c40 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e  _UNLCK) ? "winUn
17c50 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20  lockFile" :.    
17c60 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46         "winLockF
17c70 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  ile", pFile->las
17c80 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45  tErrno, sqlite3E
17c90 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20  rrName(rc)));.. 
17ca0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17cb0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
17cc0 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68  nces to VFS meth
17cd0 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ods */.static in
17ce0 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65  t winOpen(sqlite
17cf0 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61  3_vfs*,const cha
17d00 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  r*,sqlite3_file*
17d10 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74  ,int,int*);.stat
17d20 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
17d30 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63  (sqlite3_vfs *,c
17d40 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
17d50 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
17d60 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  e winShmNodeList
17d70 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
17d80 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d  ries with winShm
17d90 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
17da0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
17db0 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
17dc0 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
17dd0 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
17de0 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
17df0 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
17e00 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
17e10 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
17e20 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f  hmPurge(sqlite3_
17e30 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64  vfs *pVfs, int d
17e40 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69  eleteFlag){.  wi
17e50 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20  nShmNode **pp;. 
17e60 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a   winShmNode *p;.
17e70 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73    BOOL bRc;.  as
17e80 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
17e90 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54  xHeld() );.  OST
17ea0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
17eb0 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65   pid=%lu, delete
17ec0 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Flag=%d\n",.    
17ed0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
17ee0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
17ef0 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20  deleteFlag));.  
17f00 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
17f10 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
17f20 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
17f30 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
17f40 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
17f50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
17f60 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d  utex ) sqlite3_m
17f70 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
17f80 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ex);.      for(i
17f90 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
17fa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17fb0 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65  bRc = osUnmapVie
17fc0 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69  wOfFile(p->aRegi
17fd0 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20  on[i].pMap);.   
17fe0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
17ff0 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70  HM-PURGE-UNMAP p
18000 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
18010 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
18030 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
18040 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
18050 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
18060 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
18070 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
18080 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
18090 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
180a0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
180b0 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72  CLOSE pid=%lu, r
180c0 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
180d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
180e0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
180f0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
18100 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
18110 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
18120 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
18130 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
18140 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
18150 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
18160 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
18170 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
18180 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
18190 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
181a0 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
181b0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
181c0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
181d0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
181e0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
181f0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
18200 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18210 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
18220 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
18230 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
18240 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
18250 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
18260 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
18270 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
18280 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
18290 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
182a0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
182b0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
182c0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
182d0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
182e0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
182f0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
18300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
18310 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
18320 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18330 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
18340 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
18350 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
18360 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
18370 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
18380 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
18390 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
183a0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
183b0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
183c0 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
183d0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
183e0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
183f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
18400 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
18410 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
18420 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
18430 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
18440 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
18450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18460 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
18470 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
18480 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
18490 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
184a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
184b0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
184c0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
184d0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
184e0 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
184f0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
18500 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
18510 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
18540 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
18550 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
18560 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
18570 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
18580 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
18590 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
185a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
185c0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
185d0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
185e0 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
185f0 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
18600 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
18610 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
18620 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
18630 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
18640 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
18650 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
18660 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
18670 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
18680 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
18690 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
186a0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
186b0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
186c0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
186d0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
186e0 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
186f0 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
18700 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
18710 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
18720 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
18730 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
18740 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
18750 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
18760 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
18770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
18780 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
18790 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
187a0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
187b0 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
187c0 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
187d0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
187e0 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
187f0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
18800 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
18810 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
18820 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
18830 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
18840 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
18850 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
18860 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
18870 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
18880 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
18890 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
188a0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
188b0 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
188c0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
188d0 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
188e0 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
188f0 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
18900 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
18910 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
18920 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
18930 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
18940 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
18950 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
18960 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
18970 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
18980 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
18990 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
189a0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
189b0 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
189c0 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
189d0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
189e0 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
189f0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
18a00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18a10 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
18a20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
18a30 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
18a40 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
18a50 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
18a60 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
18a70 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
18a80 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
18a90 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
18aa0 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
18ab0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
18ac0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
18ad0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
18ae0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
18af0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
18b00 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
18b10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18b20 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
18b30 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
18b40 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
18b50 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
18b60 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
18b70 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
18b80 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ba0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
18bb0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
18bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
18bd0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
18be0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
18bf0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
18c00 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
18c10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18c20 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
18c30 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
18c40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18c50 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
18c60 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
18c70 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
18c80 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
18c90 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
18ca0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
18cb0 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
18cc0 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
18cd0 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
18ce0 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
18cf0 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
18d00 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
18d10 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
18d20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
18d30 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
18d40 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
18d50 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
18d60 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
18d70 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
18d80 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
18d90 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
18da0 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
18db0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18dd0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
18de0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
18df0 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
18e00 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
18e10 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
18e20 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
18e30 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
18e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e60 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
18e70 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
18e80 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
18e90 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
18ea0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
18eb0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
18ec0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
18ed0 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
18ee0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
18ef0 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
18f00 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
18f10 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
18f20 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
18f30 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
18f40 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
18f50 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
18f60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
18f70 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
18f80 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
18f90 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
18fa0 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
18fb0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
18fc0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
18fd0 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
18fe0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
18ff0 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
19000 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
19010 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
19020 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
19030 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65  f the winShmEnte
19040 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
19050 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
19060 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
19070 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29   (struct winShm)
19080 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
19090 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
190a0 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
190b0 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
190c0 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
190d0 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
190e0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
190f0 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
19100 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
19110 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
19120 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
19130 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
19140 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
19150 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
19160 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19170 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
19180 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
19190 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
191a0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
191b0 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
191c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
191d0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
191e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
191f0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
19200 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
19210 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
19220 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
19230 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
19240 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
19250 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
19260 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
19270 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
19280 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
19290 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
192a0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
192b0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
192c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
192d0 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
192e0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
192f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19300 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
19310 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
19320 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
19330 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
19340 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
19350 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
19360 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
19370 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  nShmUnmap(.  sql
19380 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
19390 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
193a0 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
193b0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
193c0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
193d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
193e0 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
193f0 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
19400 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
19410 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
19420 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
19430 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
19440 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
19450 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
19460 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
19470 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
19480 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
19490 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
194a0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
194b0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
194c0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
194d0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
194e0 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
194f0 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
19500 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
19510 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
19520 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
19530 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19540 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
19550 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
19560 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
19570 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
19580 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
19590 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
195a0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
195b0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
195c0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
195d0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
195e0 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
195f0 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
19600 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
19610 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
19620 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
19630 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
19640 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
19650 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
19660 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
19670 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19680 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
19690 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
196a0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
196b0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
196c0 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
196d0 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
196e0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
196f0 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
19700 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
19710 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
19720 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
19730 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
19740 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
19750 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
19760 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
19770 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
19780 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
19790 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
197a0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
197b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
197c0 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
197d0 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
197e0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
197f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19800 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
19810 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
19820 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
19830 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
19840 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
19850 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
19860 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
19870 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
19880 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
19890 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
198a0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
198b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
198c0 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
198d0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
198e0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
198f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19900 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
19910 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
19920 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
19930 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
19940 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
19950 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
19960 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
19970 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
19980 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
19990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
199a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
199b0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
199c0 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
199f0 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
19a00 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
19a10 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
19a20 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
19a30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19a40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
19a50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
19a60 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
19a70 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
19a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a90 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
19aa0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
19ab0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
19ac0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
19ad0 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
19ae0 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
19af0 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
19b00 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
19b10 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
19b20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
19b30 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
19b40 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
19b50 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
19b60 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
19b70 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
19b80 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
19b90 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
19ba0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
19bb0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
19bc0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
19bd0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
19be0 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
19bf0 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
19c00 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
19c10 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
19c20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
19c30 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
19c40 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
19c50 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
19c60 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
19c70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19c80 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
19c90 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
19ca0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
19cb0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
19cc0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
19cd0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
19ce0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
19cf0 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
19d00 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
19d10 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
19d20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
19d30 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
19d40 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
19d50 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
19d60 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
19d70 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
19d80 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
19d90 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
19da0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
19db0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
19dc0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
19dd0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
19de0 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
19df0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
19e00 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
19e10 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
19e20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
19e30 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
19e40 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
19e50 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
19e60 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
19e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19e80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19e90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
19ea0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
19eb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
19ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19ed0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
19ee0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
19ef0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
19f00 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
19f10 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
19f20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
19f30 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
19f40 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
19f50 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
19f60 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
19f70 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
19f80 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
19f90 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
19fa0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
19fb0 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
19fc0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
19fd0 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
19fe0 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
19ff0 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
1a000 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
1a010 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
1a020 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
1a030 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
1a040 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1a050 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1a060 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1a070 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1a080 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1a090 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1a0a0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1a0b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1a0c0 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
1a0d0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1a0e0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1a0f0 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
1a100 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1a110 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
1a120 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
1a130 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a140 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
1a150 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
1a160 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a170 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1a180 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1a190 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _RDLCK, ofst+WIN
1a1a0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1a1b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a1c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a1d0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1a1e0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
1a1f0 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
1a200 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1a210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a220 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1a230 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1a240 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1a250 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
1a260 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1a270 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
1a280 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
1a290 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
1a2a0 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
1a2b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1a2c0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
1a2d0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1a2e0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1a2f0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1a300 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1a310 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1a320 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
1a330 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1a340 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1a350 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1a360 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1a370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a380 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
1a390 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
1a3a0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
1a3b0 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
1a3c0 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
1a3d0 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
1a3e0 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
1a3f0 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
1a400 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a420 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
1a430 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1a440 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
1a450 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
1a460 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
1a470 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a480 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
1a490 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
1a4a0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
1a4b0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
1a4c0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1a4d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a4e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a4f0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1a500 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
1a510 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69  CE(("SHM-LOCK pi
1a520 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68  d=%lu, id=%d, sh
1a530 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65  aredMask=%03x, e
1a540 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63  xclMask=%03x, rc
1a550 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1a560 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1a570 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69  rocessId(), p->i
1a580 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  d, p->sharedMask
1a590 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20  , p->exclMask,. 
1a5a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a5b0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1a5c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a5d0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
1a5e0 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
1a5f0 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
1a600 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
1a610 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
1a620 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
1a630 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
1a640 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
1a650 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
1a660 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
1a670 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
1a680 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
1a690 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1a6a0 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
1a6b0 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
1a6c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1a6d0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1a6e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
1a6f0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1a700 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d  ETER(fd);.  /* M
1a710 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
1a720 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
1a730 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
1a740 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
1a750 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1a760 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1a770 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
1a780 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a790 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1a7a0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1a7b0 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1a7c0 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
1a7d0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1a7e0 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1a7f0 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
1a800 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1a810 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
1a820 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1a830 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1a840 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1a850 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
1a860 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
1a870 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1a880 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1a890 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1a8a0 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
1a8b0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
1a8c0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1a8d0 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72   the isWrite par
1a8e0 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
1a8f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1a900 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
1a910 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
1a920 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
1a930 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
1a940 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
1a950 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
1a960 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
1a970 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
1a980 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1a990 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1a9a0 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20   .** isWrite is 
1a9b0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1a9c0 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1a9d0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1a9e0 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
1a9f0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1aa00 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1aa10 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1aa20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1aa30 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1aa40 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1aa50 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1aa60 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1aa70 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1aa80 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1aa90 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1aaa0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1aab0 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
1aac0 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1aad0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1aae0 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1aaf0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1ab00 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
1ab10 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1ab20 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1ab30 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28  c int winShmMap(
1ab40 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ab50 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
1ab60 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
1ab70 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
1ab80 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1ab90 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
1aba0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
1abb0 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
1abc0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1abf0 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  gions */.  int i
1ac00 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  sWrite,         
1ac10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1ac20 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
1ac30 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
1ac40 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
1ac50 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
1ac60 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
1ac70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
1ac80 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
1ac90 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1aca0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
1acb0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69  DbFd->pShm;.  wi
1acc0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1acd0 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1ace0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1acf0 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   !p ){.    rc = 
1ad00 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1ad10 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
1ad20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ad30 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1ad40 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53     p = pDbFd->pS
1ad50 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f  hm;.  }.  pShmNo
1ad60 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1ad70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
1ad80 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1ad90 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
1ada0 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
1adb0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
1adc0 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
1add0 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
1ade0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1adf0 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
1ae00 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d  {.    struct Shm
1ae10 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20  Region *apNew;  
1ae20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1ae30 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  aRegion[] array 
1ae40 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
1ae50 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
1ae60 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
1ae70 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
1ae80 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1ae90 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
1aec0 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66  e of wal-index f
1aed0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  ile */..    pShm
1aee0 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
1aef0 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
1af00 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1af10 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
1af20 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1af30 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1af40 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
1af50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1af60 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
1af70 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
1af80 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
1af90 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
1afa0 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
1afb0 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
1afc0 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
1afd0 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  /.    rc = winFi
1afe0 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
1aff0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1b000 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20  ->hFile, &sz);. 
1b010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1b030 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1b040 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
1b050 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  IZE, osGetLastEr
1b060 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1b070 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1b080 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
1b090 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
1b0a0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1b0b0 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
1b0c0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
1b0d0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1b0e0 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
1b0f0 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
1b100 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
1b110 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
1b120 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
1b130 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
1b140 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1b150 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
1b160 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
1b170 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
1b180 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1b190 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
1b1a0 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
1b1b0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
1b1c0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1b1d0 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
1b1e0 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
1b1f0 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
1b200 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
1b210 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
1b220 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1b230 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
1b240 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1b250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b260 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1b270 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1b280 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1b290 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1b2a0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1b2b0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22      "winShmMap2"
1b2c0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1b2d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
1b2e0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1b2f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1b300 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
1b310 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1b320 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1b330 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
1b340 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
1b350 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65   = (struct ShmRe
1b360 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72  gion *)sqlite3_r
1b370 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
1b380 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1b390 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
1b3a0 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a  izeof(apNew[0]).
1b3b0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
1b3c0 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
1b3d0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1b3e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
1b3f0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1b400 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
1b410 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70  de->aRegion = ap
1b420 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  New;..    while(
1b430 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1b440 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
1b450 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70       HANDLE hMap
1b460 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
1b470 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67   /* file-mapping
1b480 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20   handle */.     
1b490 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b   void *pMap = 0;
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4b0 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65  Mapped memory re
1b4c0 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23 69  gion */.     .#i
1b4d0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1b4e0 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  T.      hMap = o
1b4f0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1b500 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f  ngFromApp(pShmNo
1b510 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
1b520 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1b530 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42 79  E_READWRITE, nBy
1b540 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
1b550 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1b560 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1b570 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61  _WIDE).      hMa
1b580 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1b590 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64  MappingW(pShmNod
1b5a0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
1b5b0 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1b5c0 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
1b5d0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1b5e0 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1b5f0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1b600 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20 20  HAS_ANSI).      
1b610 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1b620 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d  ileMappingA(pShm
1b630 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
1b640 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1b650 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1b660 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1b670 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
1b680 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1b690 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69  HM-MAP-CREATE pi
1b6a0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1b6b0 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73  , size=%d, rc=%s
1b6c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1b6d0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1b6e0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
1b6f0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
1b700 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
1b710 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b        hMap ? "ok
1b720 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1b730 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1b740 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
1b750 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65  ffset = pShmNode
1b760 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
1b770 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  on;.        int 
1b780 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1b790 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1b7a0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1b7b0 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66  Granularity;.#if
1b7c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1b7d0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1b7e0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1b7f0 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c  romApp(hMap, FIL
1b800 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
1b810 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
1b820 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
1b830 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
1b840 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
1b850 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
1b860 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
1b870 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1b880 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
1b890 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1b8a0 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1b8b0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f             0, iO
1b8c0 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
1b8d0 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
1b8e0 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
1b8f0 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
1b900 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1b910 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69  ("SHM-MAP-MAP pi
1b920 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1b930 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
1b940 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1b970 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
1b980 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66  de->nRegion, iOf
1b990 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  fset,.          
1b9a0 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c         szRegion,
1b9b0 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   pMap ? "ok" : "
1b9c0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1b9d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d   }.      if( !pM
1b9e0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  ap ){.        pS
1b9f0 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
1ba00 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1ba10 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63  or();.        rc
1ba20 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1ba30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
1ba40 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61  AP, pShmNode->la
1ba50 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1ba60 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1ba70 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
1ba80 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
1ba90 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
1baa0 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
1bab0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1bac0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1bad0 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
1bae0 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1baf0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
1bb00 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
1bb10 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1bb20 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1bb30 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
1bb40 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1bb50 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1bb60 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1bb70 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1bb80 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1bb90 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
1bba0 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
1bbb0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1bbc0 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1bbd0 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1bbe0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1bbf0 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1bc00 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
1bc10 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
1bc20 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
1bc30 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
1bc40 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
1bc50 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
1bc60 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1bc70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1bc80 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1bc90 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1bca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1bcb0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
1bcc0 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
1bcd0 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
1bce0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1bcf0 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
1bd00 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
1bd10 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1bd20 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1bd30 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1bd40 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
1bd50 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
1bd60 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1bd70 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
1bd80 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1bd90 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
1bda0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
1bdb0 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1bdc0 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
1bdd0 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
1bde0 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1bdf0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1be00 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
1be10 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1be20 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
1be30 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
1be40 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
1be50 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
1be60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1be70 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1be80 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1be90 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
1bea0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
1beb0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1bec0 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
1bed0 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1bee0 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
1bef0 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
1bf00 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1bf10 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
1bf20 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1bf30 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1bf40 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1bf50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1bf60 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1bf70 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1bf80 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1bf90 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
1bfa0 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
1bfc0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1bfd0 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
1bfe0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1bff0 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
1c000 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
1c010 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
1c020 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1c030 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1c040 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1c050 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c070 20 20 20 22 77 69 6e 55 6e 6d 61 70 31 22 2c 20     "winUnmap1", 
1c080 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1c090 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1c0a0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
1c0b0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1c0c0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
1c0d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1c0e0 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
1c0f0 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
1c100 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
1c110 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
1c120 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
1c130 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1c140 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1c150 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1c160 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1c170 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1c180 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1c190 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1c1a0 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
1c1b0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1c1c0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1c1d0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
1c1e0 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
1c1f0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1c200 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1c210 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1c220 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1c240 69 6e 55 6e 6d 61 70 32 22 2c 20 70 46 69 6c 65  inUnmap2", pFile
1c250 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1c260 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
1c270 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53  = NULL;.  }.  OS
1c280 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1c290 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1c2a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1c2b0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
1c2c0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1c2d0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1c2e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1c2f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1c300 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
1c310 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
1c320 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
1c330 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
1c340 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
1c350 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
1c360 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
1c370 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
1c380 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
1c390 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
1c3a0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
1c3b0 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
1c3c0 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
1c3d0 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
1c3e0 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1c3f0 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
1c400 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
1c410 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1c420 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1c430 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
1c440 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
1c450 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
1c460 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
1c470 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
1c480 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
1c490 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
1c4a0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1c4b0 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
1c4c0 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
1c4d0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1c4e0 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
1c4f0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
1c500 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
1c510 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
1c520 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1c530 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
1c540 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
1c550 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
1c560 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65  MAP_SIZE, whiche
1c570 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
1c580 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1c590 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
1c5a0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
1c5b0 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
1c5c0 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
1c5d0 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
1c5e0 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
1c5f0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
1c600 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
1c610 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
1c620 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1c630 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69  nt winMapfile(wi
1c640 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69  nFile *pFd, sqli
1c650 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
1c660 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
1c670 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
1c680 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1c690 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
1c6a0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
1c6b0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
1c6c0 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1c6d0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a  u, pFile=%p, siz
1c6e0 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20  e=%lld\n",.     
1c6f0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1c700 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1c710 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20  Fd, nByte));..  
1c720 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
1c730 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
1c740 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
1c750 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63  nMap<0 ){.    rc
1c760 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
1c770 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46  sqlite3_file*)pF
1c780 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69  d, &nMap);.    i
1c790 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f  f( rc ){.      O
1c7a0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1c7b0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1c7c0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
1c7d0 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20  OERR_FSTAT\n",. 
1c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1c7f0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1c800 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20  sId(), pFd));.  
1c810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c820 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1c830 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
1c840 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
1c850 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
1c860 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
1c870 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20  Max;.  }.  nMap 
1c880 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74  &= ~(sqlite3_int
1c890 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64  64)(winSysInfo.d
1c8a0 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  wPageSize - 1);.
1c8b0 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20   .  if( nMap==0 
1c8c0 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  && pFd->mmapSize
1c8d0 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d  >0 ){.    winUnm
1c8e0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
1c8f0 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64  .  if( nMap!=pFd
1c900 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1c910 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30    void *pNew = 0
1c920 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74  ;.    DWORD prot
1c930 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f  ect = PAGE_READO
1c940 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66  NLY;.    DWORD f
1c950 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f  lags = FILE_MAP_
1c960 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e  READ;..    winUn
1c970 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
1c980 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c    if( (pFd->ctrl
1c990 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
1c9a0 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  RDONLY)==0 ){.  
1c9b0 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41      protect = PA
1c9c0 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  GE_READWRITE;.  
1c9d0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c      flags |= FIL
1c9e0 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20  E_MAP_WRITE;.   
1c9f0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
1ca00 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e  _WINRT.    pFd->
1ca10 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1ca20 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
1ca30 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  p(pFd->h, NULL, 
1ca40 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e  protect, nMap, N
1ca50 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  ULL);.#elif defi
1ca60 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1ca70 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70  _HAS_WIDE).    p
1ca80 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65  Fd->hMap = osCre
1ca90 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1caa0 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
1cab0 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  otect,.         
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28         (DWORD)((
1cae0 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66  nMap>>32) & 0xff
1caf0 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20  ffffff),.       
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb10 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1cb20 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66  (nMap & 0xffffff
1cb30 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69  ff), NULL);.#eli
1cb40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1cb50 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1cb60 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
1cb70 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1cb80 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55  pingA(pFd->h, NU
1cb90 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20  LL, protect,.   
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1cbc0 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20  ORD)((nMap>>32) 
1cbd0 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20  & 0xffffffff),. 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1cc00 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78  DWORD)(nMap & 0x
1cc10 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29  ffffffff), NULL)
1cc20 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1cc30 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c   pFd->hMap==NULL
1cc40 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c   ){.      pFd->l
1cc50 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1cc60 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1cc70 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1cc80 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1cc90 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74  _MMAP, pFd->last
1cca0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1ccc0 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46 64 2d  inMapfile", pFd-
1ccd0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
1cce0 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
1ccf0 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
1cd00 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
1cd10 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
1cd20 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
1cd30 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52  CE(("MAP-FILE-CR
1cd40 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  EATE pid=%lu, pF
1cd50 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1cd60 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
1cd70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd80 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1cd90 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a  essId(), pFd));.
1cda0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1cdb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1cdc0 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20    assert( (nMap 
1cdd0 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  % winSysInfo.dwP
1cde0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20  ageSize)==0 );. 
1cdf0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1ce00 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f  f(SIZE_T)==sizeo
1ce10 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  f(sqlite3_int64)
1ce20 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66   || nMap<=0xffff
1ce30 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49  ffff );.#if SQLI
1ce40 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1ce50 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
1ce60 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46  OfFileFromApp(pF
1ce70 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
1ce80 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29  0, (SIZE_T)nMap)
1ce90 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77  ;.#else.    pNew
1cea0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1ceb0 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c  le(pFd->hMap, fl
1cec0 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45  ags, 0, 0, (SIZE
1ced0 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66  _T)nMap);.#endif
1cee0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  .    if( pNew==N
1cef0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43  ULL ){.      osC
1cf00 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e  loseHandle(pFd->
1cf10 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64  hMap);.      pFd
1cf20 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
1cf30 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72       pFd->lastEr
1cf40 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1cf50 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
1cf60 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1cf70 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
1cf80 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1cfa0 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20 70 46 64  winMapfile", pFd
1cfb0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1cfc0 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1cfd0 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  LE-MAP pid=%lu, 
1cfe0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1cff0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
1d000 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d010 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1d020 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29  ocessId(), pFd))
1d030 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1d040 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1d050 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
1d060 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ion = pNew;.    
1d070 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
1d080 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  nMap;.    pFd->m
1d090 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
1d0a0 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  nMap;.  }..  OST
1d0b0 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
1d0c0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1d0d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1d0e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1d0f0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1d100 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
1d110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d120 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
1d130 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1d140 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
1d150 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
1d160 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1d170 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
1d180 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
1d190 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
1d1a0 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
1d1b0 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
1d1c0 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
1d1d0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
1d1e0 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
1d1f0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
1d200 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
1d210 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1d220 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
1d230 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
1d240 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
1d250 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
1d260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1d270 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
1d280 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
1d290 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
1d2a0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1d2b0 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
1d2c0 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
1d2d0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
1d2e0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
1d2f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
1d300 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
1d310 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
1d320 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
1d330 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
1d340 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
1d350 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28  ling winUnfetch(
1d360 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1d370 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65   winFetch(sqlite
1d380 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
1d390 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20  iOff, int nAmt, 
1d3a0 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20  void **pp){.#if 
1d3b0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1d3c0 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65  SIZE>0.  winFile
1d3d0 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65   *pFd = (winFile
1d3e0 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
1d3f0 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1d400 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  se file */.#endi
1d410 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20  f.  *pp = 0;..  
1d420 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20  OSTRACE(("FETCH 
1d430 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1d440 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  p, offset=%lld, 
1d450 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70  amount=%d, pp=%p
1d460 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d470 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1d480 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66  essId(), fd, iOf
1d490 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a  f, nAmt, pp));..
1d4a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1d4b0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
1d4c0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
1d4d0 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  x>0 ){.    if( p
1d4e0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
1d4f0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
1d500 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70  c = winMapfile(p
1d510 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69  Fd, -1);.      i
1d520 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d530 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52   ){.        OSTR
1d540 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
1d550 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1d560 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1d570 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d580 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d590 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
1d5a0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1d5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d5d0 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70     if( pFd->mmap
1d5e0 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d  Size >= iOff+nAm
1d5f0 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d  t ){.      *pp =
1d600 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d   &((u8 *)pFd->pM
1d610 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b  apRegion)[iOff];
1d620 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74  .      pFd->nFet
1d630 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  chOut++;.    }. 
1d640 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54   }.#endif..  OST
1d650 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64  RACE(("FETCH pid
1d660 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1d670 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72  pp=%p, *pp=%p, r
1d680 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1d690 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d6a0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d6b0 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29  (), fd, pp, *pp)
1d6c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1d6d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d6e0 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
1d6f0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  ument is non-NUL
1d700 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
1d710 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61  ction releases a
1d720 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f   .** reference o
1d730 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61  btained by an ea
1d740 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69  rlier call to wi
1d750 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  nFetch(). The se
1d760 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
1d770 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1d780 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
1d790 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1d7a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
1d7b0 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
1d7c0 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
1d7d0 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76  e winFetch() inv
1d7e0 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  ocation. .**.** 
1d7f0 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
1d800 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
1d810 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
1d820 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1d830 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66  alled .** to inf
1d840 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65  orm the VFS laye
1d850 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e  r that, accordin
1d860 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20  g to POSIX, any 
1d870 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
1d880 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20   .** may now be 
1d890 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1d8a0 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a  ld be unmapped..
1d8b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1d8c0 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  nUnfetch(sqlite3
1d8d0 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
1d8e0 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23  Off, void *p){.#
1d8f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1d900 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46  AP_SIZE>0.  winF
1d910 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
1d920 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
1d930 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1d940 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
1d950 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
1d960 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
1d970 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
1d980 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
1d990 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
1d9a0 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
1d9b0 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
1d9c0 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
1d9d0 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
1d9e0 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
1d9f0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
1da00 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
1da10 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1da20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
1da30 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
1da40 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
1da50 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
1da60 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
1da70 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
1da80 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
1da90 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
1daa0 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  f] );..  OSTRACE
1dab0 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25  (("UNFETCH pid=%
1dac0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66  lu, pFile=%p, of
1dad0 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c  fset=%lld, p=%p\
1dae0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1daf0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1db00 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66  ssId(), pFd, iOf
1db10 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70  f, p));..  if( p
1db20 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65   ){.    pFd->nFe
1db30 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73  tchOut--;.  }els
1db40 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  e{.    /* FIXME:
1db50 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75    If Windows tru
1db60 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e  ly always preven
1db70 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72  ts truncating or
1db80 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20   deleting a.    
1db90 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20  ** file while a 
1dba0 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c  mapping is held,
1dbb0 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1dbc0 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  ing winUnmapfile
1dbd0 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69  () call.    ** i
1dbe0 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61  s unnecessary ca
1dbf0 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  n can be omitted
1dc00 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69   - potentially i
1dc10 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20  mproving.    ** 
1dc20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f  performance.  */
1dc30 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
1dc40 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
1dc50 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
1dc60 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64  chOut>=0 );.#end
1dc70 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
1dc80 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  UNFETCH pid=%lu,
1dc90 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
1dca0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
1dcb0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1dcc0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1dcd0 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  fd));.  return S
1dce0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1dcf0 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
1dd00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1dd10 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
1dd20 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
1dd30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd40 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
1dd50 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
1dd60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1dd80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dd90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dda0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ddb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ddc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1ddd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
1dde0 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
1ddf0 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
1de00 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
1de10 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c  n.** sqlite3_fil
1de20 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a  e for win32..*/.
1de30 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1de40 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1de50 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  winIoMethod = {.
1de60 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de80 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1de90 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20  .  winClose,    
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a     /* xClose */.
1dec0 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20    winRead,      
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20    /* xRead */.  
1def0 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20  winWrite,       
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77  /* xWrite */.  w
1df20 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  inTruncate,     
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1df40 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
1df50 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20   winSync,       
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77   /* xSync */.  w
1df80 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  inFileSize,     
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dfa0 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20  * xFileSize */. 
1dfb0 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20   winLock,       
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77   /* xLock */.  w
1dfe0 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  inUnlock,       
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e000 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77  * xUnlock */.  w
1e010 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  inCheckReservedL
1e020 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ock,           /
1e030 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1e040 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Lock */.  winFil
1e050 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
1e060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1e070 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77  leControl */.  w
1e080 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  inSectorSize,   
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e0a0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
1e0b0 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  .  winDeviceChar
1e0c0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20  acteristics,    
1e0d0 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
1e0e0 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
1e0f0 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20    winShmMap,    
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a    /* xShmMap */.
1e120 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20    winShmLock,   
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e140 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
1e150 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  .  winShmBarrier
1e160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e170 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
1e180 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d  r */.  winShmUnm
1e190 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
1e1a0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
1e1b0 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63  map */.  winFetc
1e1c0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
1e1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
1e1e0 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74  ch */.  winUnfet
1e1f0 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
1e200 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
1e210 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a  tch */.};../****
1e220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e260 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1e270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e280 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
1e290 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
1e2a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e2b0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
1e2c0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
1e2d0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
1e2e0 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
1e2f0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
1e300 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
1e310 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
1e320 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61  t a UTF-8 filena
1e330 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  me into whatever
1e340 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c   form the underl
1e350 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e  ying.** operatin
1e360 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66  g system wants f
1e370 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70  ilenames in.  Sp
1e380 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1e390 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74  result.** is obt
1e3a0 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
1e3b0 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  c and must be fr
1e3c0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
1e3d0 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
1e3e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
1e3f0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1e400 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ame(const char *
1e410 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f  zFilename){.  vo
1e420 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
1e430 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29   0;.  if( isNT()
1e440 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
1e450 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  ed = utf8ToUnico
1e460 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
1e470 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1e480 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1e490 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e    else{.    zCon
1e4a0 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
1e4b0 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
1e4c0 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
1e4d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
1e4e0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
1e4f0 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
1e500 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
1e510 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
1e520 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
1e530 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
1e540 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
1e550 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
1e560 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
1e570 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1e580 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
1e590 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
1e5a0 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
1e5b0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1e5c0 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
1e5d0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
1e5e0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
1e5f0 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
1e600 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
1e610 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
1e620 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
1e630 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
1e640 54 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61 72  TempPath;.  char
1e650 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54   zTempPath[SQLIT
1e660 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
1e670 5f 42 59 54 45 53 2b 32 5d 3b 0a 0a 20 20 2f 2a  _BYTES+2];..  /*
1e680 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
1e690 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
1e6a0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
1e6b0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
1e6c0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
1e6d0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
1e6e0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
1e6f0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
1e700 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
1e710 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
1e720 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
1e730 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1e740 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
1e750 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1e760 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
1e770 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e780 69 6e 74 66 28 53 51 4c 49 54 45 5f 57 49 4e 33  intf(SQLITE_WIN3
1e790 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
1e7a0 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
1e7b0 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
1e7c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e7d0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1e7e0 79 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c  y);.  }.#if !SQL
1e7f0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65  ITE_OS_WINRT.  e
1e800 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29  lse if( isNT() )
1e810 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
1e820 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57  ti;.    WCHAR zW
1e830 69 64 65 50 61 74 68 5b 53 51 4c 49 54 45 5f 57  idePath[SQLITE_W
1e840 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48  IN32_MAX_PATH_CH
1e850 41 52 53 5d 3b 0a 20 20 20 20 69 66 28 20 6f 73  ARS];.    if( os
1e860 47 65 74 54 65 6d 70 50 61 74 68 57 28 53 51 4c  GetTempPathW(SQL
1e870 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
1e880 54 48 5f 43 48 41 52 53 2d 33 30 2c 20 7a 57 69  TH_CHARS-30, zWi
1e890 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20  dePath)==0 ){.  
1e8a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
1e8b0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
1e8c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
1e8d0 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
1e8e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e8f0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
1e900 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ATH;.    }.    z
1e910 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54  Multi = unicodeT
1e920 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
1e930 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
1e940 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e950 33 5f 73 6e 70 72 69 6e 74 66 28 53 51 4c 49 54  3_snprintf(SQLIT
1e960 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
1e970 5f 42 59 54 45 53 2d 33 30 2c 20 7a 54 65 6d 70  _BYTES-30, zTemp
1e980 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  Path, "%s", zMul
1e990 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
1e9a0 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
1e9b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e9c0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
1e9d0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
1e9e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
1e9f0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
1ea00 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ea10 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
1ea20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1ea30 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1ea40 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
1ea50 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20  zUtf8;.    char 
1ea60 7a 4d 62 63 73 50 61 74 68 5b 53 51 4c 49 54 45  zMbcsPath[SQLITE
1ea70 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
1ea80 42 59 54 45 53 5d 3b 0a 20 20 20 20 69 66 28 20  BYTES];.    if( 
1ea90 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 53  osGetTempPathA(S
1eaa0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
1eab0 50 41 54 48 5f 42 59 54 45 53 2d 33 30 2c 20 7a  PATH_BYTES-30, z
1eac0 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a  MbcsPath)==0 ){.
1ead0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1eae0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
1eaf0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
1eb00 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
1eb10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1eb20 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
1eb30 50 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20  PPATH;.    }.   
1eb40 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33   zUtf8 = sqlite3
1eb50 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
1eb60 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a  tf8(zMbcsPath);.
1eb70 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
1eb80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
1eb90 6e 70 72 69 6e 74 66 28 53 51 4c 49 54 45 5f 57  nprintf(SQLITE_W
1eba0 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
1ebb0 54 45 53 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  TES-30, zTempPat
1ebc0 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  h, "%s", zUtf8);
1ebd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ebe0 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
1ebf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54  }else{.      OST
1ec00 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
1ec10 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
1ec20 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
1ec30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ec40 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ec50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
1ec60 65 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  e.  else{.    /*
1ec70 0a 20 20 20 20 2a 2a 20 43 6f 6d 70 69 6c 65 64  .    ** Compiled
1ec80 20 77 69 74 68 6f 75 74 20 41 4e 53 49 20 73 75   without ANSI su
1ec90 70 70 6f 72 74 20 61 6e 64 20 74 68 65 20 63 75  pport and the cu
1eca0 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6e 67 20  rrent operating 
1ecb0 73 79 73 74 65 6d 0a 20 20 20 20 2a 2a 20 69 73  system.    ** is
1ecc0 20 6e 6f 74 20 57 69 6e 64 6f 77 73 20 4e 54 3b   not Windows NT;
1ecd0 20 74 68 65 72 65 66 6f 72 65 2c 20 6a 75 73 74   therefore, just
1ece0 20 7a 65 72 6f 20 74 68 65 20 74 65 6d 70 6f 72   zero the tempor
1ecf0 61 72 79 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ary buffer..    
1ed00 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 54  */.    memset(zT
1ed10 65 6d 70 50 61 74 68 2c 20 30 2c 20 53 51 4c 49  empPath, 0, SQLI
1ed20 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1ed30 48 5f 42 59 54 45 53 2b 32 29 3b 0a 20 20 7d 0a  H_BYTES+2);.  }.
1ed40 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ed50 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20  _WIN32_HAS_ANSI 
1ed60 2a 2f 0a 23 65 6c 73 65 0a 20 20 65 6c 73 65 7b  */.#else.  else{
1ed70 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 43  .    /*.    ** C
1ed80 6f 6d 70 69 6c 65 64 20 66 6f 72 20 57 69 6e 52  ompiled for WinR
1ed90 54 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  T and the sqlite
1eda0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
1edb0 20 69 73 20 6e 6f 74 20 73 65 74 3b 0a 20 20 20   is not set;.   
1edc0 20 2a 2a 20 74 68 65 72 65 66 6f 72 65 2c 20 6a   ** therefore, j
1edd0 75 73 74 20 7a 65 72 6f 20 74 68 65 20 74 65 6d  ust zero the tem
1ede0 70 6f 72 61 72 79 20 62 75 66 66 65 72 2e 0a 20  porary buffer.. 
1edf0 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
1ee00 28 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 53  (zTempPath, 0, S
1ee10 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
1ee20 50 41 54 48 5f 42 59 54 45 53 2b 32 29 3b 0a 20  PATH_BYTES+2);. 
1ee30 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51   }.#endif /* !SQ
1ee40 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f  LITE_OS_WINRT */
1ee50 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1ee60 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  t the output buf
1ee70 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  fer is large eno
1ee80 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70  ugh for the temp
1ee90 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a  orary file .  **
1eea0 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20   name. If it is 
1eeb0 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  not, return SQLI
1eec0 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20  TE_ERROR..  */. 
1eed0 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73 71 6c   nTempPath = sql
1eee0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
1eef0 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66 28 20  mpPath);..  if( 
1ef00 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73 71 6c  (nTempPath + sql
1ef10 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c  ite3Strlen30(SQL
1ef20 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
1ef30 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e  EFIX) + 18) >= n
1ef40 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  Buf ){.    OSTRA
1ef50 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
1ef60 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
1ef70 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  OR\n"));.    ret
1ef80 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1ef90 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e  ;.  }..  for(i=n
1efa0 54 65 6d 70 50 61 74 68 3b 20 69 3e 30 20 26 26  TempPath; i>0 &&
1efb0 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d   zTempPath[i-1]=
1efc0 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='\\'; i--){}.  
1efd0 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30  zTempPath[i] = 0
1efe0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1eff0 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
1f000 42 75 66 2c 20 28 6e 54 65 6d 70 50 61 74 68 20  Buf, (nTempPath 
1f010 3e 20 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  > 0) ?.         
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
1f030 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  s\\"SQLITE_TEMP_
1f040 46 49 4c 45 5f 50 52 45 46 49 58 20 3a 20 53 51  FILE_PREFIX : SQ
1f050 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1f060 52 45 46 49 58 2c 0a 20 20 20 20 20 20 20 20 20  REFIX,.         
1f070 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 50            zTempP
1f080 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69  ath);.  j = sqli
1f090 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
1f0a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
1f0b0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
1f0c0 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
1f0d0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
1f0e0 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
1f0f0 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
1f100 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
1f110 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
1f120 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
1f130 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
1f140 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
1f150 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
1f160 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d  EMP-FILENAME nam
1f170 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
1f180 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  OK\n", zBuf));. 
1f190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f1a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
1f1b0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
1f1c0 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61  amed file is rea
1f1d0 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e  lly a directory.
1f1e0 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
1f1f0 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  f.** it is somet
1f200 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1f210 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20  a directory, or 
1f220 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
1f230 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  kind of memory.*
1f240 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
1f250 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
1f260 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e  int winIsDir(con
1f270 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  st void *zConver
1f280 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  ted){.  DWORD at
1f290 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
1f2a0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1f2b0 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54  rno;..  if( isNT
1f2c0 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
1f2d0 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
1f2e0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
1f2f0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
1f300 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
1f310 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
1f320 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
1f330 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
1f340 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1f350 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
1f360 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
1f390 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
1f3c0 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74  ttrData)) && ret
1f3d0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
1f3e0 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
1f3f0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
1f400 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
1f410 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f  Invalid name? */
1f420 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20  .    }.    attr 
1f430 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
1f440 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69  leAttributes;.#i
1f450 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
1f460 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E==0.  }else{.  
1f470 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
1f480 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
1f490 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
1f4a0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
1f4b0 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56  eturn (attr!=INV
1f4c0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1f4d0 55 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46  UTES) && (attr&F
1f4e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
1f4f0 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a  RECTORY);.}../*.
1f500 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a  ** Open a file..
1f510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1f520 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  nOpen(.  sqlite3
1f530 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1f540 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
1f550 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1f560 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
1f570 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1f580 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
1f590 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1f5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1f5b0 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
1f5c0 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
1f5d0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
1f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f5f0 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
1f600 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
1f610 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
1f620 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
1f630 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
1f640 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
1f650 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f  lastErrno;.  DWO
1f660 52 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65  RD dwDesiredAcce
1f670 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68  ss;.  DWORD dwSh
1f680 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44  areMode;.  DWORD
1f690 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
1f6a0 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  sition;.  DWORD 
1f6b0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
1f6c0 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51  utes = 0;.#if SQ
1f6d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1f6e0 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a  int isTemp = 0;.
1f6f0 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65  #endif.  winFile
1f700 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
1f710 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a  le*)id;.  void *
1f720 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20  zConverted;     
1f730 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1f740 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64  name in OS encod
1f750 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ing */.  const c
1f760 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d  har *zUtf8Name =
1f770 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e   zName; /* Filen
1f780 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63  ame in UTF-8 enc
1f790 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63  oding */.  int c
1f7a0 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  nt = 0;..  /* If
1f7b0 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
1f7c0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
1f7d0 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
1f7e0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1f7f0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
1f800 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
1f810 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
1f820 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
1f830 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
1f840 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 53 51 4c 49  ar zTmpname[SQLI
1f850 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
1f860 48 5f 42 59 54 45 53 2b 32 5d 3b 20 2f 2a 20 42  H_BYTES+2]; /* B
1f870 75 66 66 65 72 20 66 6f 72 20 74 65 6d 70 20 66  uffer for temp f
1f880 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e  ilename */..  in
1f890 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f8a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1f8b0 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
1f8c0 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66  Code */.#if !def
1f8d0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
1f8e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1f8f0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
1f900 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
1f910 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
1f920 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64   to open */.#end
1f930 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  if..  int isExcl
1f940 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
1f950 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
1f960 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
1f970 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
1f980 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1f990 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1f9a0 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
1f9b0 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
1f9c0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
1f9d0 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
1f9e0 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
1f9f0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1fa00 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
1fa10 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
1fa20 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1fa30 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
1fa40 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
1fa50 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
1fa60 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
1fa70 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
1fa80 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1fa90 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1faa0 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
1fab0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1fac0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
1fad0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1fae0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
1faf0 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
1fb00 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
1fb10 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67  , pFile=%p, flag
1fb20 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  s=%x, pOutFlags=
1fb30 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
1fb40 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c    zUtf8Name, id,
1fb50 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
1fb60 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s));..  /* Check
1fb70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1fb80 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
1fb90 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
1fba0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
1fbb0 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
1fbc0 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
1fbd0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
1fbe0 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
1fbf0 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
1fc00 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
1fc10 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1fc20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
1fc30 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
1fc40 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
1fc50 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
1fc60 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
1fc70 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
1fc80 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
1fc90 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
1fca0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
1fcb0 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
1fcc0 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
1fcd0 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
1fce0 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
1fcf0 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
1fd00 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
1fd10 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
1fd20 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
1fd30 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
1fd40 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
1fd50 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
1fd60 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
1fd70 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
1fd80 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
1fd90 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
1fda0 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
1fdb0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
1fdc0 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
1fdd0 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
1fde0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1fdf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
1fe00 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
1fe10 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
1fe20 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1fe30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
1fe40 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
1fe50 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
1fe60 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1fe70 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
1fe80 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
1fe90 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
1fea0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1feb0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
1fec0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
1fed0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
1fee0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
1fef0 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
1ff00 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
1ff10 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
1ff20 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
1ff30 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
1ff40 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
1ff50 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1ff60 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
1ff70 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1ff80 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
1ff90 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
1ffa0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1ffb0 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
1ffc0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1ffd0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
1ffe0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1fff0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
20000 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
20010 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
20020 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
20030 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
20040 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
20050 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
20060 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
20070 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
20080 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
20090 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
200a0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
200b0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  );.  pFile->h = 
200c0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
200d0 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ALUE;..#if SQLIT
200e0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
200f0 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   !sqlite3_temp_d
20100 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
20110 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
20120 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20  TE_ERROR,.      
20130 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f    "sqlite3_temp_
20140 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62  directory variab
20150 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  le should be set
20160 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20   for WinRT");.  
20170 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
20180 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
20190 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
201a0 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20  nction is NULL, 
201b0 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a  generate a .  **
201c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
201d0 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a  name to use .  *
201e0 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  /.  if( !zUtf8Na
201f0 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
20200 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73  (isDelete && !is
20210 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  OpenJournal);.  
20220 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61    rc = getTempna
20230 6d 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  me(SQLITE_WIN32_
20240 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2b 32  MAX_PATH_BYTES+2
20250 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
20260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20270 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  OK ){.      OSTR
20280 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
20290 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74 66  %s, rc=%s", zUtf
202a0 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  8Name, sqlite3Er
202b0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
202c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
202d0 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d    }.    zUtf8Nam
202e0 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20  e = zTmpname;.  
202f0 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65  }..  /* Database
20300 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64   filenames are d
20310 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69  ouble-zero termi
20320 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61 72  nated if they ar
20330 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20  e not.  ** URIs 
20340 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
20350 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
20360 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
20370 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c  ed into.  ** sql
20380 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
20390 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
203a0 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c  ert( (eType!=SQL
203b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
203c0 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  ) || (flags & SQ
203d0 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c  LITE_OPEN_URI) |
203e0 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e  |.        zUtf8N
203f0 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74 66 38  ame[strlen(zUtf8
20400 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a  Name)+1]==0 );..
20410 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
20420 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65   filename to the
20430 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67   system encoding
20440 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65  . */.  zConverte
20450 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
20460 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
20470 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
20480 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
20490 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
204a0 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
204b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a  _IOERR_NOMEM", z
204c0 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20  Utf8Name));.    
204d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
204e0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ERR_NOMEM;.  }..
204f0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
20500 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
20510 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20520 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
20530 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
20540 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
20550 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
20560 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
20570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20580 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
20590 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
205a0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
205b0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
205c0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
205d0 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
205e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
205f0 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
20600 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
20610 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
20620 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
20630 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
20640 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
20650 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74  e is .  ** creat
20660 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
20670 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
20680 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
20690 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61   access" .  ** a
206a0 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
206b0 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
206c0 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
206d0 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
206e0 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
206f0 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
20700 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
20710 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
20720 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
20730 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
20740 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
20750 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
20760 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
20770 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
20780 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
20790 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
207a0 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
207b0 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
207c0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
207d0 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
207e0 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
207f0 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
20800 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
20810 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
20820 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
20830 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
20840 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
20850 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
20860 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
20870 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
20880 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
20890 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
208a0 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
208b0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
208c0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
208d0 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
208e0 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
208f0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
20900 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
20910 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
20940 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
20950 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
20980 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
20990 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
209a0 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
209b0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
209c0 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
209d0 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
209e0 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
209f0 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
20a00 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
20a10 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
20a20 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
20a30 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
20a40 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
20a50 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
20a60 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
20a70 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
20a80 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
20a90 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
20aa0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e  endif..  if( isN
20ab0 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
20ac0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43  E_OS_WINRT.    C
20ad0 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
20ae0 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65  DED_PARAMETERS e
20af0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
20b00 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  s;.    extendedP
20b10 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65  arameters.dwSize
20b20 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45   = sizeof(CREATE
20b30 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
20b40 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20  ARAMETERS);.    
20b50 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
20b60 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  rs.dwFileAttribu
20b70 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tes =.          
20b80 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
20b90 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54  ibutes & FILE_AT
20ba0 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20  TRIBUTE_MASK;.  
20bb0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
20bc0 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73  ters.dwFileFlags
20bd0 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74   = dwFlagsAndAtt
20be0 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46  ributes & FILE_F
20bf0 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  LAG_MASK;.    ex
20c00 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
20c10 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c  .dwSecurityQosFl
20c20 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41  ags = SECURITY_A
20c30 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78  NONYMOUS;.    ex
20c40 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
20c50 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69  .lpSecurityAttri
20c60 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  butes = NULL;.  
20c70 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
20c80 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69  ters.hTemplateFi
20c90 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77  le = NULL;.    w
20ca0 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
20cb0 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54  ateFile2((LPCWST
20cc0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
20cf0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d10 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
20d20 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  reMode,.        
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
20d50 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65             &exte
20d80 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29  ndedParameters))
20d90 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
20da0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
20db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20dc0 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
20dd0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
20de0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
20df0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
20e00 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  /.    }.#else.  
20e10 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
20e20 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43  CreateFileW((LPC
20e30 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
20e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
20e60 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
20e90 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
20ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
20ec0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
20ed0 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
20f00 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d          NULL))==
20f30 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
20f40 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72        retryIoerr
20f70 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
20f80 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
20f90 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
20fa0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
20fb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
20fc0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
20fd0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
20fe0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
20ff0 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
21000 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
21030 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
21060 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
21090 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
210a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210b0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
210c0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
210d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
210e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
210f0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
21100 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
21110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
21130 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
21140 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
21150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21160 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  oop */.    }.  }
21170 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49 6f 65  .#endif.  logIoe
21180 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52  rr(cnt);..  OSTR
21190 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
211a0 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
211b0 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e  ess=%lx, rc=%s\n
211c0 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  ", h, zUtf8Name,
211d0 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65  .           dwDe
211e0 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d  siredAccess, (h=
211f0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
21200 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64  VALUE) ? "failed
21210 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69  " : "ok"));..  i
21220 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
21230 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
21240 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
21250 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
21260 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
21270 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
21280 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
21290 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55  o, "winOpen", zU
212a0 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  tf8Name);.    sq
212b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
212c0 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20  erted);.    if( 
212d0 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21  isReadWrite && !
212e0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
212f0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f       return winO
21300 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  pen(pVfs, zName,
21310 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 28   id, .         (
21320 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50  (flags|SQLITE_OP
21330 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20  EN_READONLY) &. 
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45      ~(SQLITE_OPE
21360 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f  N_CREATE|SQLITE_
21370 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29  OPEN_READWRITE))
21380 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75 74 46  ,.         pOutF
21390 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lags);.    }else
213a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
213b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
213c0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
213d0 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
213e0 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  ){.    if( isRea
213f0 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  dWrite ){.      
21400 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
21410 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
21420 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
21430 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
21440 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
21450 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
21460 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  }..  OSTRACE(("O
21470 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d  PEN file=%p, nam
21480 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78  e=%s, access=%lx
21490 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20  , pOutFlags=%p, 
214a0 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22  *pOutFlags=%d, "
214b0 0a 20 20 20 20 20 20 20 20 20 20 20 22 72 63 3d  .           "rc=
214c0 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e  %s\n", h, zUtf8N
214d0 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63  ame, dwDesiredAc
214e0 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c  cess, pOutFlags,
214f0 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20   pOutFlags ?.   
21500 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61          *pOutFla
21510 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41  gs : 0, (h==INVA
21520 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
21530 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
21540 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ok"));..#if SQLI
21550 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
21560 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
21570 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
21580 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20  PEN_MAIN_DB.    
21590 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63     && (rc = winc
215a0 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
215b0 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49  e, pFile))!=SQLI
215c0 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f  TE_OK.  ){.    o
215d0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b  sCloseHandle(h);
215e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
215f0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
21600 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
21610 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25  N-CE-LOCK name=%
21620 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61  s, rc=%s\n", zNa
21630 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
21640 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65  me(rc)));.    re
21650 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
21660 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
21670 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
21680 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
21690 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
216a0 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
216b0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
216c0 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 70 46 69  ted);.  }..  pFi
216d0 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77  le->pMethod = &w
216e0 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46  inIoMethod;.  pF
216f0 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
21700 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
21710 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
21720 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ly ){.    pFile-
21730 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
21740 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  NFILE_RDONLY;.  
21750 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
21760 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d  uri_boolean(zNam
21770 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54  e, "psow", SQLIT
21780 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
21790 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46  WRITE) ){.    pF
217a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
217b0 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a  = WINFILE_PSOW;.
217c0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73    }.  pFile->las
217d0 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
217e0 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  R;.  pFile->zPat
217f0 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53  h = zName;.#if S
21800 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
21810 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68  IZE>0.  pFile->h
21820 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46  Map = NULL;.  pF
21830 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
21840 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
21850 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46  apSize = 0;.  pF
21860 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
21870 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ual = 0;.  pFile
21880 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
21890 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
218a0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
218b0 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  if..  OpenCounte
218c0 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
218d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
218e0 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
218f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
21900 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
21910 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
21920 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
21930 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
21940 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
21950 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
21960 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
21970 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
21980 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
21990 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
219a0 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
219b0 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
219c0 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
219d0 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
219e0 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
219f0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
21a00 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
21a10 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
21a20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
21a30 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
21a40 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
21a50 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
21a60 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
21a70 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
21a80 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
21a90 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
21aa0 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
21ab0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
21ac0 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
21ad0 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
21ae0 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
21af0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
21b00 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
21b10 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
21b20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
21b30 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
21b40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
21b50 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
21b60 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
21b70 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
21b80 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
21b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
21ba0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
21bb0 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
21bc0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
21bd0 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f  WORD attr;.  DWO
21be0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
21bf0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
21c00 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
21c10 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
21c20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73  USED_PARAMETER(s
21c30 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75  yncDir);..  Simu
21c40 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
21c50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
21c60 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41  DELETE);.  OSTRA
21c70 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
21c80 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c  =%s, syncDir=%d\
21c90 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73  n", zFilename, s
21ca0 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f  yncDir));..  zCo
21cb0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
21cc0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
21cd0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
21ce0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
21cf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21d00 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
21d10 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
21d20 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66   ){.    do {.#if
21d30 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
21d40 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  .      WIN32_FIL
21d50 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
21d60 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
21d70 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
21d80 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
21d90 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
21da0 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65    if ( osGetFile
21db0 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43  AttributesExW(zC
21dc0 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c  onverted, GetFil
21dd0 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
21de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e00 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29     &sAttrData) )
21e10 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
21e20 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
21e30 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
21e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21e50 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
21e60 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
21e70 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
21e80 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
21e90 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
21ea0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
21eb0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
21ec0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
21ed0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21ee0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
21ef0 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
21f00 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
21f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
21f30 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
21f40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
21f50 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
21f60 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
21f70 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
21f80 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
21f90 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  f.      if ( att
21fa0 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
21fb0 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
21fc0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
21fd0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
21fe0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
21ff0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
22000 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
22010 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
22020 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
22030 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
22040 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
22050 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
22060 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
22070 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
22080 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22090 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
220a0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
220b0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
220c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
220d0 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
220e0 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
220f0 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
22100 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
22110 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
22120 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
22130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22140 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
22150 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eW(zConverted) )
22160 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
22170 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
22180 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
22190 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
221a0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 72   }.      if ( !r
221b0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
221c0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
221d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
221e0 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
221f0 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
22200 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
22210 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
22220 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64  ile(1);.  }.#ifd
22230 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
22240 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
22250 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
22260 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
22270 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
22280 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69  verted);.      i
22290 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
222a0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
222b0 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
222c0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
222d0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
222e0 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
222f0 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
22300 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
22310 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
22320 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
22330 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
22340 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22350 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
22360 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
22370 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
22380 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
22390 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
223a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
223b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
223c0 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
223d0 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
223e0 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
223f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22400 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
22410 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
22420 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22430 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
22440 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
22450 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
22460 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22470 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
22480 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
22490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
224a0 69 66 20 28 20 21 72 65 74 72 79 49 6f 65 72 72  if ( !retryIoerr
224b0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
224c0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
224d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
224e0 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
224f0 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
22500 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
22510 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
22520 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
22530 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
22540 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
22550 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
22560 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
22570 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
22580 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
22590 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65 6c           "winDel
225a0 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
225b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
225c0 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
225d0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
225e0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
225f0 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
22600 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c   name=%s, rc=%s\
22610 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73  n", zFilename, s
22620 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
22630 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
22640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
22650 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 61   the existence a
22660 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66  nd status of a f
22670 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
22680 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20  nt winAccess(.  
22690 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
226a0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  s,         /* No
226b0 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
226c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
226d0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
226e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
226f0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
22700 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
22710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
22720 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65   of test to make
22730 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
22740 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22760 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a   OUT: Result */.
22770 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
22780 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
22790 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
227a0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
227b0 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
227c0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
227d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
227e0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
227f0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
22800 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  );.  OSTRACE(("A
22810 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66  CCESS name=%s, f
22820 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74  lags=%x, pResOut
22830 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
22840 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c     zFilename, fl
22850 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ags, pResOut));.
22860 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
22870 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
22880 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
22890 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
228a0 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
228b0 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
228c0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
228d0 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
228e0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
228f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22900 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
22910 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
22920 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
22930 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
22940 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
22950 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
22960 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
22970 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
22980 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
22990 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
229a0 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
229b0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
229c0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
229f0 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20 20  tandard, .      
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
22a20 61 29 29 20 26 26 20 72 65 74 72 79 49 6f 65 72  a)) && retryIoer
22a30 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
22a40 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
22a50 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  rc ){.      /* F
22a60 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43  or an SQLITE_ACC
22a70 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79  ESS_EXISTS query
22a80 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c  , treat a zero-l
22a90 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20  ength file.     
22aa0 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65   ** as if it doe
22ab0 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
22ac0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
22ad0 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45     flags==SQLITE
22ae0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20  _ACCESS_EXISTS. 
22af0 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
22b00 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48  rData.nFileSizeH
22b10 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  igh==0 .        
22b20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
22b30 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29  FileSizeLow==0 )
22b40 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
22b50 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
22b60 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
22b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
22b80 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
22b90 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
22ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
22bb0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f  lse{.      logIo
22bc0 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20 20  err(cnt);.      
22bd0 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45  if( lastErrno!=E
22be0 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
22bf0 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e 6f  UND && lastErrno
22c00 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  !=ERROR_PATH_NOT
22c10 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
22c20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
22c30 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
22c40 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  S, lastErrno, "w
22c50 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c 65  inAccess", zFile
22c60 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73  name);.        s
22c70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
22c80 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
22c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22ca0 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 20  OERR_ACCESS;.   
22cb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22cc0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
22cd0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
22ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22cf0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
22d00 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
22d10 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74  .  else{.    att
22d20 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
22d30 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
22d40 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
22d50 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
22d60 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22d70 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
22d80 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
22d90 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
22da0 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
22db0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
22dc0 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
22dd0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
22de0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
22df0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
22e00 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
22e10 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
22e20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
22e30 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
22e40 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
22e50 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
22e60 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
22e70 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
22e80 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
22e90 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
22ea0 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
22eb0 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
22ec0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
22ed0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43  ;.  OSTRACE(("AC
22ee0 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52  CESS name=%s, pR
22ef0 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
22f00 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
22f10 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
22f20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52     zFilename, pR
22f30 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
22f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22f50 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
22f60 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
22f70 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
22f80 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  ed path name sho
22f90 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62  uld be used verb
22fa0 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e  atim.  If.** non
22fb0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
22fc0 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  d from this func
22fd0 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e  tion, the callin
22fe0 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
22ff0 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68  simply.** use th
23000 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20  e provided path 
23010 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f  name verbatim -O
23020 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e  R- resolve it in
23030 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e  to a full path n
23040 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ame.** using the
23050 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
23060 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74   Win32 API funct
23070 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c  ion (if availabl
23080 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  e)..*/.static BO
23090 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d  OL winIsVerbatim
230a0 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
230b0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
230c0 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  e.){.  /*.  ** I
230d0 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
230e0 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f  starts with a fo
230f0 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61  rward slash or a
23100 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69   backslash, it i
23110 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20  s either.  ** a 
23120 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20  legal UNC name, 
23130 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  a volume relativ
23140 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62  e path, or an ab
23150 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65  solute path name
23160 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e   in the.  ** "Un
23170 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69  ix" format on Wi
23180 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73  ndows.  There is
23190 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20   no easy way to 
231a0 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
231b0 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66  tween.  ** the f
231c0 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20  inal two cases; 
231d0 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65  therefore, we re
231e0 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72  turn the safer r
231f0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
23200 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  RUE.  ** so that
23210 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   callers of this
23220 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
23230 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72  imply use it ver
23240 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  batim..  */.  if
23250 20 28 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d   ( zPathname[0]=
23260 3d 27 2f 27 20 7c 7c 20 7a 50 61 74 68 6e 61 6d  ='/' || zPathnam
23270 65 5b 30 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  e[0]=='\\' ){.  
23280 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
23290 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
232a0 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
232b0 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74  tarts with a let
232c0 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20  ter and a colon 
232d0 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76  it is either a v
232e0 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74  olume.  ** relat
232f0 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61  ive path or an a
23300 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43  bsolute path.  C
23310 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
23320 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  unction must not
23330 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  .  ** attempt to
23340 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72   treat it as a r
23350 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
23360 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f  e (i.e. they sho
23370 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20  uld simply use. 
23380 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29   ** it verbatim)
23390 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ..  */.  if ( sq
233a0 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61  lite3Isalpha(zPa
233b0 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50  thname[0]) && zP
233c0 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20  athname[1]==':' 
233d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
233e0 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
233f0 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
23400 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
23410 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
23420 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
23430 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
23440 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
23450 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
23460 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
23470 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
23480 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
23490 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
234a0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
234b0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
234c0 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
234d0 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
234e0 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
234f0 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
23500 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
23510 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
23520 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
23530 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
23540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
23550 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
23560 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
23570 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
23580 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
23590 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
235a0 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
235b0 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
235c0 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
235d0 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
235e0 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23600 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
23610 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
23620 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
23650 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
23660 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
23670 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
23680 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
23690 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
236a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
236b0 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65  R(nFull);.  asse
236c0 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
236d0 6e 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 57 49 4e  name>=SQLITE_WIN
236e0 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
236f0 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  S );.  assert( n
23700 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61  Full>=pVfs->mxPa
23710 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28  thname );.  if (
23720 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
23730 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
23740 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
23750 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
23760 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
23770 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
23780 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
23790 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
237a0 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
237b0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
237c0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
237d0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
237e0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
237f0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
23800 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
23810 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
23820 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
23830 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
23840 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
23850 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
23860 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a  ry and a slash..
23870 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
23880 7a 4f 75 74 5b 53 51 4c 49 54 45 5f 57 49 4e 33  zOut[SQLITE_WIN3
23890 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
238a0 2b 31 5d 3b 0a 20 20 20 20 69 66 28 20 63 79 67  +1];.    if( cyg
238b0 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43  win_conv_path(CC
238c0 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
238d0 7c 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a  |CCP_RELATIVE, z
238e0 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 0a  Relative, zOut,.
238f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23900 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
23910 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42  WIN32_MAX_PATH_B
23920 59 54 45 53 2b 31 29 3c 30 20 29 7b 0a 20 20 20  YTES+1)<0 ){.   
23930 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
23940 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
23950 55 4c 4c 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ULLPATH, (DWORD)
23960 65 72 72 6e 6f 2c 20 22 63 79 67 77 69 6e 5f 63  errno, "cygwin_c
23970 6f 6e 76 5f 70 61 74 68 22 2c 0a 20 20 20 20 20  onv_path",.     
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65               zRe
23990 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 20 20 72  lative);.      r
239a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
239b0 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a  TOPEN_FULLPATH;.
239c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
239d0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
239e0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
239f0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
23a00 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20  "%s\\%s",.      
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
23a20 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
23a30 63 74 6f 72 79 2c 20 7a 4f 75 74 29 3b 0a 20 20  ctory, zOut);.  
23a40 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 63  }else{.    if( c
23a50 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
23a60 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
23a70 5f 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a  _A, zRelative, z
23a80 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3c 30 20 29  Full, nFull)<0 )
23a90 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  {.      winLogEr
23aa0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
23ab0 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 28 44  PEN_FULLPATH, (D
23ac0 57 4f 52 44 29 65 72 72 6e 6f 2c 20 22 63 79 67  WORD)errno, "cyg
23ad0 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 22 2c 0a  win_conv_path",.
23ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23af0 20 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20    zRelative);.  
23b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
23b10 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
23b20 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ATH;.    }.  }. 
23b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23b40 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28  K;.#endif..#if (
23b50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
23b60 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
23b70 52 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  RT) && !defined(
23b80 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
23b90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
23ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23bb0 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  OR );.  /* WinCE
23bc0 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
23bd0 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
23be0 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
23bf0 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a  am told. */.  /*
23c00 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61   WinRT has no wa
23c10 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72  y to convert a r
23c20 65 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20  elative path to 
23c30 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e  an absolute one.
23c40 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74   */.  if ( sqlit
23c50 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
23c60 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
23c70 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
23c80 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
23c90 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
23ca0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
23cb0 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
23cc0 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
23cd0 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
23ce0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
23cf0 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
23d00 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
23d10 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
23d20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
23d30 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
23d40 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
23d50 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
23d60 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
23d70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
23d80 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
23d90 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20   a backslash..  
23da0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
23db0 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
23dc0 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
23dd0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
23de0 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20  %s\\%s",.       
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23e00 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
23e10 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76 65 29  tory, zRelative)
23e20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
23e30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23e40 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
23e50 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
23e60 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61  ull, "%s", zRela
23e70 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tive);.  }.  ret
23e80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
23e90 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
23ea0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
23eb0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
23ec0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
23ed0 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20  GWIN__).  DWORD 
23ee0 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
23ef0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
23f00 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49  r *zOut;..  /* I
23f10 66 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65  f this path name
23f20 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58   begins with "/X
23f30 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73  :", where "X" is
23f40 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a   any alphabetic.
23f50 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
23f60 64 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74  discard the init
23f70 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65  ial "/" from the
23f80 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   pathname..  */.
23f90 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
23fa0 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74  0]=='/' && sqlit
23fb0 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74  e3Isalpha(zRelat
23fc0 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61  ive[1]) && zRela
23fd0 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a  tive[2]==':' ){.
23fe0 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
23ff0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
24000 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
24010 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
24020 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
24030 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
24040 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
24050 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
24060 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
24070 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
24080 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
24090 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
240a0 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
240b0 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
240c0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
240d0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
240e0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
240f0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
24100 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
24110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24120 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
24130 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
24140 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
24150 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
24160 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
24170 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
24180 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
24190 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
241a0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
241b0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
241c0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
241d0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
241e0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
241f0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
24200 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
24210 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
24220 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
24230 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
24240 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
24250 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
24260 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
24270 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
24280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
24290 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
242a0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
242b0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
242c0 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20  l, "%s\\%s",.   
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242e0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
242f0 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74  irectory, zRelat
24300 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
24310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
24320 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
24330 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
24340 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  me(zRelative);. 
24350 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
24360 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
24370 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
24380 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
24390 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
243a0 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
243b0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
243c0 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
243d0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
243e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
243f0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
24400 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
24410 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47  QLITE_ERROR, osG
24420 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
24430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24440 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
24450 65 57 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64  eW1", zConverted
24460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24470 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24480 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24490 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
244a0 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a  FULLPATH;.    }.
244b0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
244c0 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
244d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
244e0 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
244f0 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
24500 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
24510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24520 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
24530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24540 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
24550 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
24560 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
24570 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
24580 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
24590 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  Temp, 0);.    if
245a0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
245b0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
245c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73  SQLITE_ERROR, os
245d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61    "GetFullPathNa
24600 6d 65 57 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65  meW2", zConverte
24610 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
24620 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
24630 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
24640 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
24650 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24660 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
24670 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20  PATH;.    }.    
24680 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
24690 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
246a0 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
246b0 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
246c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
246d0 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  p);.  }.#ifdef S
246e0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
246f0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
24700 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
24710 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
24720 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
24730 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
24740 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
24750 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
24760 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
24770 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73  SQLITE_ERROR, os
24780 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247a0 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61    "GetFullPathNa
247b0 6d 65 41 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65  meA1", zConverte
247c0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
247d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
247e0 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
247f0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
24800 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d  _FULLPATH;.    }
24810 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
24820 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
24830 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
24840 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
24850 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
24860 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
24870 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24880 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
24890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
248a0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
248b0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
248c0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
248d0 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
248e0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
248f0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
24900 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
24910 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
24920 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47  QLITE_ERROR, osG
24930 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
24940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24950 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
24960 65 41 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64  eA2", zConverted
24970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24980 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
24990 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
249a0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
249b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
249c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
249d0 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ATH;.    }.    s
249e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
249f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
24a00 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
24a10 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
24a20 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
24a30 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
24a40 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
24a50 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
24a60 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
24a70 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
24a80 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
24a90 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
24aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24ab0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
24ac0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
24ae0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
24af0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
24b00 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
24b10 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
24b20 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
24b30 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
24b40 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
24b50 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
24b60 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
24b70 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
24b80 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
24b90 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
24ba0 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  library..*/./*.*
24bb0 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
24bc0 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
24bd0 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
24be0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
24bf0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
24c00 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
24c10 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
24c20 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
24c30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
24c40 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  nDlOpen(sqlite3_
24c50 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
24c60 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
24c70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
24c80 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
24c90 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46  d = convertUtf8F
24ca0 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
24cb0 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e);.  UNUSED_PAR
24cc0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
24cd0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
24ce0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
24cf0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  0;.  }.  if( isN
24d00 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
24d10 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68  E_OS_WINRT.    h
24d20 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65   = osLoadPackage
24d30 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54  dLibrary((LPCWST
24d40 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29  R)zConverted, 0)
24d50 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20  ;.#else.    h = 
24d60 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28  osLoadLibraryW((
24d70 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
24d80 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
24d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
24da0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
24db0 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c  lse{.    h = osL
24dc0 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61  oadLibraryA((cha
24dd0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
24de0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
24df0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
24e00 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
24e10 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
24e20 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
24e30 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
24e40 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
24e50 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
24e60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
24e70 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65 74 4c  ER(pVfs);.  getL
24e80 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
24e90 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
24ea0 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  uf, zBufOut);.}.
24eb0 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69  static void (*wi
24ec0 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  nDlSym(sqlite3_v
24ed0 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70  fs *pVfs,void *p
24ee0 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  H,const char *zS
24ef0 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e  ym))(void){.  UN
24f00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
24f10 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
24f20 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73  void(*)(void))os
24f30 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
24f40 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d  (HANDLE)pH, zSym
24f50 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
24f60 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69   winDlClose(sqli
24f70 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
24f80 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
24f90 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
24fa0 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65  R(pVfs);.  osFre
24fb0 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45  eLibrary((HANDLE
24fc0 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c  )pHandle);.}.#el
24fd0 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
24fe0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
24ff0 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
25000 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
25010 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
25020 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
25030 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
25040 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
25050 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
25060 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  endif.../*.** Wr
25070 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62  ite up to nBuf b
25080 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65  ytes of randomne
25090 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f  ss into zBuf..*/
250a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
250b0 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
250c0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
250d0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
250e0 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  f){.  int n = 0;
250f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25100 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64  TER(pVfs);.#if d
25110 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
25120 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a  ST).  n = nBuf;.
25130 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
25140 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  , nBuf);.#else. 
25150 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54   if( sizeof(SYST
25160 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20  EMTIME)<=nBuf-n 
25170 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d  ){.    SYSTEMTIM
25180 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79  E x;.    osGetSy
25190 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
251a0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
251b0 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  ], &x, sizeof(x)
251c0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
251d0 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  of(x);.  }.  if(
251e0 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
251f0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
25200 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43  ORD pid = osGetC
25210 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
25220 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
25230 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69  Buf[n], &pid, si
25240 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20  zeof(pid));.    
25250 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29  n += sizeof(pid)
25260 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
25270 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
25280 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47  sizeof(ULONGLONG
25290 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
252a0 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d   ULONGLONG cnt =
252b0 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
252c0 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  4();.    memcpy(
252d0 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
252e0 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
252f0 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
25300 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  t);.  }.#else.  
25310 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
25320 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
25330 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47   DWORD cnt = osG
25340 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20  etTickCount();. 
25350 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
25360 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
25370 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
25380 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
25390 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
253a0 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45  izeof(LARGE_INTE
253b0 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  GER)<=nBuf-n ){.
253c0 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
253d0 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79  R i;.    osQuery
253e0 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
253f0 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63  er(&i);.    memc
25400 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c  py(&zBuf[n], &i,
25410 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20   sizeof(i));.   
25420 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b   n += sizeof(i);
25430 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
25440 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
25450 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
25460 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
25470 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
25480 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
25490 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
254a0 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
254b0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
254c0 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33  osec){.  sqlite3
254d0 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69  _win32_sleep((mi
254e0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
254f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
25500 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
25510 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63  eturn ((microsec
25520 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30  +999)/1000)*1000
25530 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
25540 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
25550 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
25560 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
25570 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
25580 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
25590 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
255a0 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
255b0 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
255c0 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
255d0 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
255e0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
255f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
25600 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
25610 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
25620 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
25630 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
25640 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
25650 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
25660 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
25670 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
25680 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
25690 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
256a0 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
256b0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
256c0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
256d0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
256e0 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
256f0 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
25700 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
25710 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
25720 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
25730 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
25740 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
25750 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
25760 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
25770 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
25780 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
25790 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
257a0 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
257b0 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
257c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
257d0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
257e0 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65  RROR if the time
257f0 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61   and date .** ca
25800 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
25810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
25820 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
25830 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
25840 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  fs, sqlite3_int6
25850 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20  4 *piNow){.  /* 
25860 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
25870 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
25880 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
25890 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
258a0 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
258b0 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
258c0 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
258d0 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
258e0 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46  13.5). .  */.  F
258f0 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74  ILETIME ft;.  st
25900 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
25910 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65  e3_int64 winFile
25920 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35  timeEpoch = 2305
25930 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  8135*(sqlite3_in
25940 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66  t64)8640000;.#if
25950 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
25960 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
25970 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
25980 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
25990 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
259a0 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66  )8640000;.#endif
259b0 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20  .  /* 2^32 - to 
259c0 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20  avoid use of LL 
259d0 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20  and warnings in 
259e0 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  gcc */.  static 
259f0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
25a00 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75  t64 max32BitValu
25a10 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69  e = .      (sqli
25a20 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
25a30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
25a40 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
25a50 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65   +.      (sqlite
25a60 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39  3_int64)29496729
25a70 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  6;..#if SQLITE_O
25a80 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d  S_WINCE.  SYSTEM
25a90 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47  TIME time;.  osG
25aa0 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
25ab0 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
25ac0 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
25ad0 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
25ae0 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
25af0 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69   if (!osSystemTi
25b00 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
25b10 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
25b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25b30 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f  R;.  }.#else.  o
25b40 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  sGetSystemTimeAs
25b50 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
25b60 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
25b70 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
25b80 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
25b90 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
25ba0 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
25bb0 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
25bc0 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20  Value) + .      
25bd0 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
25be0 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
25bf0 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
25c00 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
25c10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
25c20 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
25c30 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
25c40 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
25c50 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
25c60 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
25c70 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
25c80 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
25c90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25ca0 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
25cb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
25cc0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
25cd0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
25ce0 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
25cf0 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
25d00 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
25d10 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
25d20 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
25d30 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
25d40 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
25d50 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
25d60 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
25d70 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
25d80 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
25d90 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
25da0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
25db0 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
25dc0 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Now){.  int rc;.
25dd0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
25de0 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72  i;.  rc = winCur
25df0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56  rentTimeInt64(pV
25e00 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21  fs, &i);.  if( !
25e10 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  rc ){.    *prNow
25e20 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
25e30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
25e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
25e50 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
25e60 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
25e70 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
25e80 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
25e90 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
25ea0 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57  atMessage() on W
25eb0 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
25ec0 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
25ed0 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41  _r() on Unix). A
25ee0 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
25ef0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
25f00 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
25f10 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
25f20 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
25f30 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
25f40 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
25f50 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
25f60 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
25f70 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
25f80 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
25f90 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
25fa0 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
25fb0 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
25fc0 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
25fd0 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
25fe0 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e   occurred within
25ff0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
26000 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  thread..**.** If
26010 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
26020 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
26030 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64  for the supplied
26040 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73   buffer,.** it s
26050 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
26060 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ed. The return v
26070 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74  alue of xGetLast
26080 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  Error.** is zero
26090 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
260a0 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
260b0 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
260c0 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
260d0 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
260e0 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
260f0 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ). If non-zero i
26100 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74  s returned,.** t
26110 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hen it is not ne
26120 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75  cessary to inclu
26130 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  de the nul-termi
26140 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  nator character.
26150 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ** in the output
26160 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   buffer..**.** N
26170 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20  ot supplying an 
26180 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
26190 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72  ll have no adver
261a0 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20  se effect.** on 
261b0 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69  SQLite. It is fi
261c0 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d  ne to have an im
261d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
261e0 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72  t never.** retur
261f0 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ns an error mess
26200 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74  age:.**.**   int
26210 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73   xGetLastError(s
26220 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
26230 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
26240 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20   *zBuf){.**     
26250 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d  assert(zBuf[0]==
26260 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65  '\0');.**     re
26270 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a  turn 0;.**   }.*
26280 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20  *.** However if 
26290 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
262a0 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74   is supplied, it
262b0 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f   will be incorpo
262c0 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  rated.** by sqli
262d0 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  te into the erro
262e0 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61  r message availa
262f0 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20  ble to the user 
26300 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
26310 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69  _errmsg(), possi
26320 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72  bly making IO er
26330 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64  rors easier to d
26340 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ebug..*/.static 
26350 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
26360 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
26370 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
26380 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
26390 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
263a0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
263b0 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
263c0 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
263d0 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a  ), nBuf, zBuf);.
263e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
263f0 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61  ize and deinitia
26400 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
26410 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
26420 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
26430 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
26440 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
26450 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
26460 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
26470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
26480 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
26490 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
264a0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
264b0 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
264c0 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
264d0 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
264e0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26500 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
26510 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
26520 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
26530 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
26540 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
26550 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
26560 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
26570 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
26580 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
26590 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
265a0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
265b0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
265c0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
265d0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
265e0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
265f0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
26600 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
26610 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
26620 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
26630 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
26640 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
26650 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
26660 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
26670 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
26680 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
26690 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
266a0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
266b0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
266c0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
266d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
266e0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
266f0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
26700 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
26710 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
26720 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
26730 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
26740 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
26750 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
26760 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
26770 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
26780 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
26790 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
267a0 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
267b0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
267c0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
267d0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
267e0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
267f0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a  emCall */.  };..
26800 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63    /* Double-chec
26810 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63  k that the aSysc
26820 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20  all[] array has 
26830 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
26840 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e  .  ** correctly.
26850 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62    See ticket [bb
26860 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d  3a86e890c8e96ab]
26870 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72   */.  assert( Ar
26880 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
26890 29 3d 3d 37 34 20 29 3b 0a 0a 20 20 2f 2a 20 67  )==74 );..  /* g
268a0 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c  et memory map al
268b0 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61  location granula
268c0 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  rity */.  memset
268d0 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c  (&winSysInfo, 0,
268e0 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49   sizeof(SYSTEM_I
268f0 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54  NFO));.#if SQLIT
26900 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47  E_OS_WINRT.  osG
26910 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
26920 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
26930 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
26940 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
26950 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Info);.#endif.  
26960 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
26970 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
26980 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a  ranularity>0 );.
26990 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
269a0 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e  Info.dwPageSize>
269b0 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  0 );..  sqlite3_
269c0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
269d0 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75  nVfs, 1);.  retu
269e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
269f0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
26a00 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66  _end(void){ .#if
26a10 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
26a20 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21  .  if( sleepObj!
26a30 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43  =NULL ){.    osC
26a40 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70  loseHandle(sleep
26a50 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f  Obj);.    sleepO
26a60 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23  bj = NULL;.  }.#
26a70 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
26a80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
26a90 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
26aa0 5f 57 49 4e 20 2a 2f 0a                          _WIN */.