/ Hex Artifact Content
Login

Artifact 1f7cc110551cb8045c2ca7d41ac42e2afa787d56:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 20 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f  # include <errno
0250: 2e 68 3e 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74  .h> /* amalgamat
0260: 6f 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 65 6e 64  or: keep */.#end
0270: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0280: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0290: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
02a0: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
02b0: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
02c0: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69  .h"../*.** Compi
02d0: 6c 69 6e 67 20 61 6e 64 20 75 73 69 6e 67 20 57  ling and using W
02e0: 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72 65 73  AL mode requires
02f0: 20 73 65 76 65 72 61 6c 20 41 50 49 73 20 74 68   several APIs th
0300: 61 74 20 61 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61  at are only.** a
0310: 76 61 69 6c 61 62 6c 65 20 69 6e 20 57 69 6e 64  vailable in Wind
0320: 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 62 61  ows platforms ba
0330: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
0340: 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 20 21 53 51  rnel..*/.#if !SQ
0350: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 26 26  LITE_OS_WINNT &&
0360: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
0370: 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23 20 20 65 72  _OMIT_WAL).#  er
0380: 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65 20 72 65  ror "WAL mode re
0390: 71 75 69 72 65 73 20 73 75 70 70 6f 72 74 20 66  quires support f
03a0: 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20  rom the Windows 
03b0: 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f 6d 70 69  NT kernel, compi
03c0: 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c 49 54 45  le\. with SQLITE
03d0: 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23 65 6e 64  _OMIT_WAL.".#end
03e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f  if../*.** Are mo
03f0: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20  st of the Win32 
0400: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61  ANSI APIs availa
0410: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63  ble (i.e. with c
0420: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e  ertain exception
0430: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
0440: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f  e sub-platform)?
0450: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
0460: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
0470: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
0480: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0490: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23  WIN32_NO_ANSI).#
04a0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
04b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
04c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
04d0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
04e0: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20  32 Unicode APIs 
04f0: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20  available (i.e. 
0500: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63  with certain exc
0510: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64  eptions.** based
0520: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74   on the sub-plat
0530: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53  form)?.*/.#if (S
0540: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0550: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0560: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0570: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21  INRT) && \.    !
0580: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
0590: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20  IN32_NO_WIDE).# 
05a0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
05b0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65  IN32_HAS_WIDE.#e
05c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
05d0: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f   sure at least o
05e0: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20  ne set of Win32 
05f0: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c  APIs is availabl
0600: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
0610: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0620: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
0630: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
0640: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20  32_HAS_WIDE).#  
0650: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20  error "At least 
0660: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49  one of SQLITE_WI
0670: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64  N32_HAS_ANSI and
0680: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
0690: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65  S_WIDE\. must be
06a0: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69   defined.".#endi
06b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  f../*.** This co
06c0: 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c  nstant should al
06d0: 72 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64  ready be defined
06e0: 20 28 69 6e 20 74 68 65 20 22 57 69 6e 44 65 66   (in the "WinDef
06f0: 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a  .h" SDK file)..*
0700: 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58 5f 50 41  /.#ifndef MAX_PA
0710: 54 48 0a 23 20 20 64 65 66 69 6e 65 20 4d 41 58  TH.#  define MAX
0720: 5f 50 41 54 48 20 20 20 20 20 20 20 20 20 20 20  _PATH           
0730: 20 20 20 20 20 20 20 20 20 20 20 28 32 36 30 29             (260)
0740: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0750: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0760: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0770: 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68  ) for Win32.  Th
0780: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0790: 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54  ly be.** MAX_PAT
07a0: 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  H..*/.#ifndef SQ
07b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
07c0: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
07d0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
07e0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
07f0: 20 20 28 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e    (MAX_PATH).#en
0800: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
0810: 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64 20  constant should 
0820: 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69 6e  already be defin
0830: 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e 4e  ed (in the "WinN
0840: 54 2e 68 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a  T.h" SDK file)..
0850: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 49 43 4f  */.#ifndef UNICO
0860: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0870: 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  ARS.#  define UN
0880: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0890: 5f 43 48 41 52 53 20 20 20 20 20 20 28 33 32 37  _CHARS      (327
08a0: 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  67).#endif../*.*
08b0: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
08c0: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
08d0: 61 72 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20  ars) for WinNT. 
08e0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
08f0: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43  mally be.** UNIC
0900: 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43  ODE_STRING_MAX_C
0910: 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  HARS..*/.#ifndef
0920: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
0930: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0940: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0950: 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  NNT_MAX_PATH_CHA
0960: 52 53 20 20 20 28 55 4e 49 43 4f 44 45 5f 53 54  RS   (UNICODE_ST
0970: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a  RING_MAX_CHARS).
0980: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0990: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
09a0: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
09b0: 20 66 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 65   for Win32.  The
09c0: 20 4d 41 58 5f 50 41 54 48 20 6d 61 63 72 6f 20   MAX_PATH macro 
09d0: 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74  is in.** charact
09e0: 65 72 73 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63  ers, so we alloc
09f0: 61 74 65 20 34 20 62 79 74 65 73 20 70 65 72 20  ate 4 bytes per 
0a00: 63 68 61 72 61 63 74 65 72 20 61 73 73 75 6d 69  character assumi
0a10: 6e 67 20 77 6f 72 73 74 2d 63 61 73 65 20 6f 66  ng worst-case of
0a20: 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70 65 72 2d  .** 4-bytes-per-
0a30: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 55 54  character for UT
0a40: 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  F8..*/.#ifndef S
0a50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0a60: 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65  PATH_BYTES.#  de
0a70: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
0a80: 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
0a90: 20 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32     (SQLITE_WIN32
0aa0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 2a  _MAX_PATH_CHARS*
0ab0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  4).#endif../*.**
0ac0: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0ad0: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0ae0: 65 73 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20  es) for WinNT.  
0af0: 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d  This should norm
0b00: 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f  ally be.** UNICO
0b10: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0b20: 41 52 53 20 2a 20 73 69 7a 65 6f 66 28 57 43 48  ARS * sizeof(WCH
0b30: 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  AR)..*/.#ifndef 
0b40: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
0b50: 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20 20 64  _PATH_BYTES.#  d
0b60: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0b70: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
0b80: 53 20 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20  S   \.          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 28 73 69 7a 65 6f 66 28 57 43 48 41 52 29    (sizeof(WCHAR)
0bb0: 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f   * SQLITE_WINNT_
0bc0: 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 29 0a  MAX_PATH_CHARS).
0bd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
0be0: 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d 65 73 73  ximum error mess
0bf0: 61 67 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63  age length (in c
0c00: 68 61 72 73 29 20 66 6f 72 20 57 69 6e 52 54 2e  hars) for WinRT.
0c10: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0c20: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
0c30: 4d 53 47 5f 43 48 41 52 53 0a 23 20 20 64 65 66  MSG_CHARS.#  def
0c40: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
0c50: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
0c60: 53 20 28 31 30 32 34 29 0a 23 65 6e 64 69 66 0a  S (1024).#endif.
0c70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
0c80: 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 63  on-zero if the c
0c90: 68 61 72 61 63 74 65 72 20 73 68 6f 75 6c 64 20  haracter should 
0ca0: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 61 20  be treated as a 
0cb0: 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70  directory.** sep
0cc0: 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64  arator..*/.#ifnd
0cd0: 65 66 20 77 69 6e 49 73 44 69 72 53 65 70 0a 23  ef winIsDirSep.#
0ce0: 20 20 64 65 66 69 6e 65 20 77 69 6e 49 73 44 69    define winIsDi
0cf0: 72 53 65 70 28 61 29 20 20 20 20 20 20 20 20 20  rSep(a)         
0d00: 20 20 20 20 20 20 20 28 28 28 61 29 20 3d 3d 20         (((a) == 
0d10: 27 2f 27 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20  '/') || ((a) == 
0d20: 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  '\\')).#endif../
0d30: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
0d40: 69 73 20 75 73 65 64 20 77 68 65 6e 20 61 20 6c  is used when a l
0d50: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  ocal variable is
0d60: 20 73 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20   set to a value 
0d70: 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65  that is.** [some
0d80: 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73 65 64 20  times] not used 
0d90: 62 79 20 74 68 65 20 63 6f 64 65 20 28 65 2e 67  by the code (e.g
0da0: 2e 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61  . via conditiona
0db0: 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a  l compilation)..
0dc0: 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45  */.#ifndef UNUSE
0dd0: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
0de0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 55 53 45  .#  define UNUSE
0df0: 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
0e00: 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 23 65  (x) (void)(x).#e
0e10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
0e20: 72 6e 73 20 74 68 65 20 63 68 61 72 61 63 74 65  rns the characte
0e30: 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  r that should be
0e40: 20 75 73 65 64 20 61 73 20 74 68 65 20 64 69 72   used as the dir
0e50: 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
0e60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e  ..*/.#ifndef win
0e70: 47 65 74 44 69 72 53 65 70 0a 23 20 20 64 65 66  GetDirSep.#  def
0e80: 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53 65 70  ine winGetDirSep
0e90: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
0ea0: 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f    '\\'.#endif../
0eb0: 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20  *.** Do we need 
0ec0: 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69  to manually defi
0ed0: 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c  ne the Win32 fil
0ee0: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66  e mapping APIs f
0ef0: 6f 72 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a  or use with WAL.
0f00: 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68  ** mode (e.g. th
0f10: 65 73 65 20 41 50 49 73 20 61 72 65 20 61 76 61  ese APIs are ava
0f20: 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69  ilable in the Wi
0f30: 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f  ndows CE SDK; ho
0f40: 77 65 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61  wever, they.** a
0f50: 72 65 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  re not present i
0f60: 6e 20 74 68 65 20 68 65 61 64 65 72 20 66 69 6c  n the header fil
0f70: 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  e)?.*/.#if SQLIT
0f80: 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50  E_WIN32_FILEMAPP
0f90: 49 4e 47 5f 41 50 49 20 26 26 20 21 64 65 66 69  ING_API && !defi
0fa0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
0fb0: 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f  WAL)./*.** Two o
0fc0: 66 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69  f the file mappi
0fd0: 6e 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66  ng APIs are diff
0fe0: 65 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52  erent under WinR
0ff0: 54 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  T.  Figure out w
1000: 68 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e  hich.** set we n
1010: 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  eed..*/.#if SQLI
1020: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42  TE_OS_WINRT.WINB
1030: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1040: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
1050: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41  appingFromApp(HA
1060: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
1070: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
1080: 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c  BUTES, ULONG, UL
1090: 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b  ONG64, LPCWSTR);
10a0: 0a 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56  ..WINBASEAPI LPV
10b0: 4f 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69  OID WINAPI MapVi
10c0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
10d0: 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55  HANDLE, ULONG, U
10e0: 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b  LONG64, SIZE_T);
10f0: 0a 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e  .#else.#if defin
1100: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1110: 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53  HAS_ANSI).WINBAS
1120: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
1130: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
1140: 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50  pingA(HANDLE, LP
1150: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
1160: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
1170: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
1180: 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e  RD, LPCSTR);.#en
1190: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
11a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
11b0: 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65  ANSI) */..#if de
11c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
11d0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e  32_HAS_WIDE).WIN
11e0: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
11f0: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
1200: 4d 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c  MappingW(HANDLE,
1210: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
1220: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
1230: 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20    DWORD, DWORD, 
1240: 44 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b  DWORD, LPCWSTR);
1250: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
1260: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1270: 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49  HAS_WIDE) */..WI
1280: 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20  NBASEAPI LPVOID 
1290: 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66  WINAPI MapViewOf
12a0: 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f  File(HANDLE, DWO
12b0: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
12c0: 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69  , SIZE_T);.#endi
12d0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
12e0: 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  INRT */../*.** T
12f0: 68 69 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  his file mapping
1300: 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74   API is common t
1310: 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64  o both Win32 and
1320: 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41   WinRT..*/.WINBA
1330: 53 45 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50  SEAPI BOOL WINAP
1340: 49 20 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  I UnmapViewOfFil
1350: 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64  e(LPCVOID);.#end
1360: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
1370: 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41  32_FILEMAPPING_A
1380: 50 49 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  PI && !defined(S
1390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
13a0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
13b0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
13c0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
13d0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
13e0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
13f0: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
1400: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
1410: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
1420: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
1430: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
1440: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
1450: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
1460: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
1470: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
1480: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
1490: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
14a0: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
14b0: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
14c0: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
14d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14e0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
14f0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
1500: 6f 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  o structures use
1510: 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70  d for WAL */.typ
1520: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53  edef struct winS
1530: 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20  hm winShm;      
1540: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63       /* A connec
1550: 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
1560: 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66  emory */.typedef
1570: 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
1580: 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20  de winShmNode;  
1590: 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20   /* A region of 
15a0: 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
15b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
15c0: 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76  inCE lacks nativ
15d0: 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69  e support for fi
15e0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65  le locking so we
15f0: 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74   have to fake it
1600: 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f  .** with some co
1610: 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a  de of our own..*
1620: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  /.#if SQLITE_OS_
1630: 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74  WINCE.typedef st
1640: 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b  ruct winceLock {
1650: 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b  .  int nReaders;
1660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1670: 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73   of reader locks
1680: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42   obtained */.  B
1690: 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20  OOL bPending;   
16a0: 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20     /* Indicates 
16b0: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  a pending lock h
16c0: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
16d0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65   */.  BOOL bRese
16e0: 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64  rved;     /* Ind
16f0: 69 63 61 74 65 73 20 61 20 72 65 73 65 72 76 65  icates a reserve
1700: 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  d lock has been 
1710: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f  obtained */.  BO
1720: 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20  OL bExclusive;  
1730: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61    /* Indicates a
1740: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1750: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1760: 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63  ed */.} winceLoc
1770: 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  k;.#endif../*.**
1780: 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72   The winFile str
1790: 75 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63  ucture is a subc
17a0: 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  lass of sqlite3_
17b0: 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74  file* specific t
17c0: 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70  o the win32.** p
17d0: 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72  ortability layer
17e0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
17f0: 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46  uct winFile winF
1800: 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46  ile;.struct winF
1810: 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71  ile {.  const sq
1820: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1830: 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20   *pMethod; /*** 
1840: 4d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a  Must be first **
1850: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
1860: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20   *pVfs;      /* 
1870: 54 68 65 20 56 46 53 20 75 73 65 64 20 74 6f 20  The VFS used to 
1880: 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  open this file *
1890: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20  /.  HANDLE h;   
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
18b0: 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73  andle for access
18c0: 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  ing the file */.
18d0: 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20    u8 locktype;  
18e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
18f0: 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e  e of lock curren
1900: 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  tly held on this
1910: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74   file */.  short
1920: 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b   sharedLockByte;
1930: 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63     /* Randomly c
1940: 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64 20  hosen byte used 
1950: 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  as a shared lock
1960: 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61   */.  u8 ctrlFla
1970: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs;           /*
1980: 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e   Flags.  See WIN
1990: 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a  FILE_* below */.
19a0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
19b0: 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  o;        /* The
19c0: 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
19d0: 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
19e0: 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65   error */.#ifnde
19f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1a00: 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d  L.  winShm *pShm
1a10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
1a20: 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65  nstance of share
1a30: 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73  d memory on this
1a40: 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
1a50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1a60: 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c  ath;      /* Ful
1a70: 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1a80: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
1a90: 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20   szChunk;       
1aa0: 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69       /* Chunk si
1ab0: 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ze configured by
1ac0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1ad0: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1ae0: 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54  OS_WINCE.  LPWST
1af0: 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  R zDeleteOnClose
1b00: 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69  ;  /* Name of fi
1b10: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65  le to delete whe
1b20: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48  n closing */.  H
1b30: 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20  ANDLE hMutex;   
1b40: 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20         /* Mutex 
1b50: 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  used to control 
1b60: 61 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64  access to shared
1b70: 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20 48 41 4e   lock */  .  HAN
1b80: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20  DLE hShared;    
1b90: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
1ba0: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73  emory segment us
1bb0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a  ed for locking *
1bc0: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f  /.  winceLock lo
1bd0: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  cal;        /* L
1be0: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79  ocks obtained by
1bf0: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f   this instance o
1c00: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77  f winFile */.  w
1c10: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64  inceLock *shared
1c20: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  ;      /* Global
1c30: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d   shared lock mem
1c40: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ory for the file
1c50: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20    */.#endif.#if 
1c60: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1c70: 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65  SIZE>0.  int nFe
1c80: 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20  tchOut;         
1c90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ca0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1cb0: 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
1cc0: 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d  s */.  HANDLE hM
1cd0: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1ce0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
1cf0: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65 6d  or accessing mem
1d00: 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  ory mapping */. 
1d10: 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f   void *pMapRegio
1d20: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
1d30: 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61  * Area memory ma
1d40: 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pped */.  sqlite
1d50: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1d60: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c  ;       /* Usabl
1d70: 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64  e size of mapped
1d80: 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c   region */.  sql
1d90: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1da0: 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63  izeActual; /* Ac
1db0: 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70  tual size of map
1dc0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
1dd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1de0: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a  apSizeMax;    /*
1df0: 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54   Configured FCNT
1e00: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75  L_MMAP_SIZE valu
1e10: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1e20: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
1e30: 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65  lues for winFile
1e40: 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64  .ctrlFlags.*/.#d
1e50: 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44  efine WINFILE_RD
1e60: 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78  ONLY          0x
1e70: 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  02   /* Connecti
1e80: 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20  on is read only 
1e90: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1ea0: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
1eb0: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
1ec0: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
1ed0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
1ee0: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
1ef0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
1f00: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1f10: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
1f20: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
1f30: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1f40: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
1f50: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
1f60: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
1f70: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
1f80: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
1f90: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1fa0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
1fb0: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
1fc0: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
1fd0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
1fe0: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
1ff0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
2000: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
2010: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
2020: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
2030: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
2040: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
2050: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
2060: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
2070: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
2080: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
2090: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
20a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
20b0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
20c0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
20d0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
20e0: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
20f0: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
2100: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
2110: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
2120: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2130: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
2140: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
2150: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2160: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
2170: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
2180: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
2190: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
21a0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
21b0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
21c0: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
21d0: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
21e0: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
21f0: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
2200: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
2210: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
2220: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
2230: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
2240: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
2250: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
2260: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
2270: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
2280: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
2290: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
22a0: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
22b0: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
22c0: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
22d0: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
22e0: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
22f0: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
2300: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
2310: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
2320: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2330: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
2340: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
2350: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
23b0: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
23c0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
23d0: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
23e0: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
23f0: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
2400: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
2410: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
2420: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
2430: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
2440: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
2450: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
2460: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
2470: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
2480: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
2490: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
24a0: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
24b0: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
24c0: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
24d0: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
24e0: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
24f0: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
2500: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
2510: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
2520: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
2530: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
2540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2580: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
2590: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
25a0: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
25b0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
25c0: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
25d0: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
25e0: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
25f0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
2600: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
2610: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2620: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2630: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2640: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
2650: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2660: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
2670: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
2680: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
2690: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
26c0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
26d0: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
26e0: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
26f0: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
2700: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
2710: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
2720: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2730: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2750: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
2760: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2770: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2780: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
2790: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
27a0: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
27b0: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
27c0: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
27d0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
27e0: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
27f0: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
2800: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
2810: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2820: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
2830: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2840: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
2850: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0).#endif.../*.*
2860: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
2870: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
2880: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
2890: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
28a0: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
28b0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
28c0: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
28d0: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
28e0: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
28f0: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
2900: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
2910: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2920: 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20    u32 magic1;   
2930: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
2940: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
2950: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
2960: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
2970: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
2980: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
2990: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
29a0: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
29b0: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
29c0: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
29d0: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
29e0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
29f0: 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f   u32 magic2;   /
2a00: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
2a10: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
2a20: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
2a30: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66  /.#endif.};..#if
2a40: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
2a50: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
2a60: 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62  1     0x42b2830b
2a70: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f  .#define WINMEM_
2a80: 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34  MAGIC2     0xbd4
2a90: 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74  d7cf4.#endif..st
2aa0: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
2ab0: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
2ac0: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
2ad0: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
2ae0: 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20  MAGIC1,.#endif. 
2af0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66   NULL, FALSE.#if
2b00: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57  ndef NDEBUG.  ,W
2b10: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e  INMEM_MAGIC2.#en
2b20: 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  dif.};..#ifndef 
2b30: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
2b40: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
2b50: 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  1() assert( win_
2b60: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d  mem_data.magic1=
2b70: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
2b80: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
2b90: 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73  ssertMagic2() as
2ba0: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
2bb0: 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  ta.magic2==WINME
2bc0: 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69  M_MAGIC2 ).#defi
2bd0: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
2be0: 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73  agic()  winMemAs
2bf0: 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69  sertMagic1(); wi
2c00: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32  nMemAssertMagic2
2c10: 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ();.#else.#defin
2c20: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2c30: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
2c40: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44  efine winMemGetD
2c50: 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d  ataPtr()  &win_m
2c60: 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20  em_data.#define 
2c70: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
2c80: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
2c90: 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77  .hHeap.#define w
2ca0: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
2cb0: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
2cc0: 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76  bOwned..static v
2cd0: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
2ce0: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
2cf0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
2d00: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
2d10: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
2d20: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
2d30: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
2d40: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
2d50: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
2d60: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
2d70: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
2d80: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
2d90: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
2da0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
2db0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
2dc0: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
2dd0: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
2de0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
2df0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
2e00: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
2e10: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
2e20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
2e30: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
2e40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
2e50: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
2e60: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
2e70: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
2e80: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
2e90: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
2ea0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2eb0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
2ec0: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
2ed0: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
2ee0: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
2ef0: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
2f00: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
2f10: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
2f20: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
2f30: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
2f40: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
2f50: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
2f60: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
2f70: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
2f80: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
2f90: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
2fa0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
2fb0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
2fc0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2fd0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
2fe0: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
2ff0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3000: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
3010: 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20  S_WINRT && \.   
3020: 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54     defined(SQLIT
3030: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3040: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
3050: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3060: 44 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73  DE).static int s
3070: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
3080: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
3090: 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64  def SYSCALL.#  d
30a0: 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71  efine SYSCALL sq
30b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
30c0: 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  r.#endif../*.** 
30d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
30e0: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f   not available o
30f0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20  n Windows CE or 
3100: 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20  WinRT.. */..#if 
3110: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
3120: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
3130: 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41  RT.#  define osA
3140: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
3150: 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a         1.#endif.
3160: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
3170: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
3180: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
3190: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
31a0: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
31b0: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
31c0: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
31d0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
31e0: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
31f0: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
3200: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
3210: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
3220: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
3230: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
3240: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
3250: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
3260: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
3270: 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63   struct win_sysc
3280: 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68  all {.  const ch
3290: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
32a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
32b0: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
32c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
32d0: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
32e0: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
32f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
3300: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
3310: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3320: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
3330: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
3340: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
3350: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3360: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
3370: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72  OS_WINRT.  { "Ar
3380: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
3390: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
33a0: 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  )AreFileApisANSI
33b0: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
33c0: 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c  else.  { "AreFil
33d0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
33e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3410: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65  f..#ifndef osAre
3420: 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65  FileApisANSI.#de
3430: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
3440: 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49  isANSI ((BOOL(WI
3450: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
3460: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
3470: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
3480: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3490: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
34a0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
34b0: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
34c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
34d0: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
34e0: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
34f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3500: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
3510: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3520: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3540: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3550: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
3560: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
3570: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
3580: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
3590: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
35a0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
35b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
35c0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
35d0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
35e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
35f0: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
3600: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3610: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
3620: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3630: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3660: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
3670: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
3680: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
3690: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
36a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
36b0: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
36c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
36d0: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
36e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
36f0: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
3700: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
3710: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
3720: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
3730: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
3740: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3750: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
3760: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
3770: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
3780: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
3790: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
37a0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
37b0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
37c0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
37f0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3800: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
3810: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
3820: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
3830: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
3840: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
3850: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
3860: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
3870: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
3880: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3890: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
38a0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
38b0: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
38d0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
38e0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
38f0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3900: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
3910: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3920: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3930: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3940: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3950: 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28  osCreateFileW ((
3960: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
3970: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
3980: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
3990: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
39a0: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
39b0: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
39c0: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[5].pCurrent)..
39d0: 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f  #if (!SQLITE_OS_
39e0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
39f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3a00: 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20  S_ANSI) && \.   
3a10: 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51       !defined(SQ
3a20: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a  LITE_OMIT_WAL)).
3a30: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
3a40: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
3a50: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
3a60: 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20 20 20  leMappingA,     
3a70: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3a80: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
3a90: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
3aa0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3ac0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3ad0: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
3ae0: 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c 45 28  ppingA ((HANDLE(
3af0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
3b00: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
3b10: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
3b20: 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f   DWORD,DWORD,DWO
3b30: 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79 73 63  RD,LPCSTR))aSysc
3b40: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
3b50: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
3b60: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
3b70: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
3b80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3b90: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
3ba0: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
3bb0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
3bc0: 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  AL)).  { "Create
3bd0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
3be0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
3bf0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
3c00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3c10: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3c20: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
3c30: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c50: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3c60: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3c70: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
3c80: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
3c90: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
3ca0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
3cb0: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
3cc0: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
3cd0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
3ce0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3cf0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
3d00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3d10: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3d20: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
3d30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3d40: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
3d50: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
3d60: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3d70: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
3d80: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3d90: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3db0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3dc0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
3dd0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3de0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
3df0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
3e00: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
3e10: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
3e20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3e30: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3e40: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3e50: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
3e60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3e70: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3e90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
3ea0: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
3eb0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3ed0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3ee0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
3ef0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
3f00: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
3f10: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
3f20: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3f30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3f40: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3f50: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3f70: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
3f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3f90: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3fa0: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
3fb0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3fc0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3fd0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3fe0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3ff0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
4000: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4010: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
4020: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4030: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4040: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4050: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4060: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4070: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4080: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
4090: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
40a0: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
40b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
40d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
40e0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
40f0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
4100: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
4110: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
4120: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
4130: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
4140: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4150: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4160: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4170: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4180: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
4190: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
41a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
41b0: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
41c0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
41d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
41f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4200: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
4210: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
4220: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
4230: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
4240: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
4250: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
4260: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4270: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
4280: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4290: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
42a0: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
42b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
42c0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
42d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
42e0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
42f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4300: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4310: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4320: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4330: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
4340: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
4350: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
4360: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4370: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
4380: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4390: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
43b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
43c0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
43d0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
43e0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
43f0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4400: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
4410: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
4420: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
4430: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4440: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4450: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
4460: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
4470: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4480: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
4490: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
44a0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
44b0: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
44c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
44f0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
4500: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
4510: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
4520: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
4530: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
4540: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
4550: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
4560: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
4570: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
4580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
4590: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
45a0: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
45b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
45c0: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
45e0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65  .#else.  { "Free
45f0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
4600: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4620: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4630: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
4640: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
4650: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
4660: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
4670: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4680: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
4690: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
46a0: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
46b0: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
46c0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
46d0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
46e0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
46f0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
4700: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
4710: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4720: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
4730: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4740: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
4750: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
4760: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4770: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4780: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
4790: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
47a0: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
47b0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
47e0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
47f0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
4800: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4810: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
4820: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
4830: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
4840: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
4850: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4860: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
4870: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4880: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4890: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
48a0: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
48b0: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
48c0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
48d0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
48e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
48f0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
4900: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
4910: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4930: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4940: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
4950: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
4960: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
4970: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
4980: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
4990: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
49a0: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
49b0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
49c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
49d0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
49e0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
49f0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
4a00: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4a10: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
4a20: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
4a30: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
4a40: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4a70: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
4a80: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
4a90: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4aa0: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4ab0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
4ac0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4ad0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4ae0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4af0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
4b00: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
4b10: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
4b20: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4b30: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
4b40: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
4b50: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
4b60: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4b90: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
4ba0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
4bb0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
4bc0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4bd0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
4be0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4bf0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4c00: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
4c10: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
4c20: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4c30: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
4c40: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4c50: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4c60: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
4c70: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4ca0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
4cb0: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
4cc0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
4cd0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
4ce0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
4cf0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
4d00: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
4d10: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4d20: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4d30: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
4d40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4d50: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4d70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4d80: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
4d90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4db0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4dc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4dd0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
4de0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
4df0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
4e00: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e  call[23].pCurren
4e10: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4e20: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4e30: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4e40: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4e50: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
4e60: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4e70: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
4e80: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
4e90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4ea0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
4eb0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4ec0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ed0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4ee0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4ef0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
4f00: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4f10: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
4f20: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
4f30: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
4f40: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
4f50: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4f60: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4f70: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4f80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4f90: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4fa0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
4fb0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
4fc0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
4fd0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
4fe0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
4ff0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
5000: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5030: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5040: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
5050: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5060: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
5070: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
5080: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
5090: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
50a0: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
50b0: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
50c0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
50d0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
50e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
50f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
5100: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5110: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
5120: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
5130: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5140: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5150: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54  NSION).#if SQLIT
5160: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
5170: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
5180: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
5190: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
51a0: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
51b0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
51c0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
51d0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
51e0: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
51f0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5200: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
5210: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
5220: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
5230: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
5240: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
5250: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
5260: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
5270: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
5280: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
5290: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
52a0: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
52b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
52c0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20  endif.#else.  { 
52d0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
52e0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
52f0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5310: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5320: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  e osGetProcAddre
5330: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49  ssA ((FARPROC(WI
5340: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20  NAPI*)(HMODULE, 
5350: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
5360: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
5370: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5380: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5390: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
53a0: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
53b0: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
53c0: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
53d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
53e0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
53f0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5400: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5410: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5420: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5430: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
5440: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
5450: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  (LPSYSTEM_INFO))
5460: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
5470: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
5480: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
5490: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
54a0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  GetSystemTime,  
54b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
54c0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
54d0: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  emTime ((VOID(WI
54e0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54  NAPI*)(LPSYSTEMT
54f0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39  IME))aSyscall[29
5500: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5510: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5520: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  E.  { "GetSystem
5530: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
5540: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
5550: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5560: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
5570: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5580: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
5590: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
55b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
55c0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
55d0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28  imeAsFileTime ((
55e0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
55f0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
5600: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30  IME))aSyscall[30
5610: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5620: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5630: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
5640: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5650: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
5660: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
5670: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20  athA,           
5680: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5690: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
56a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
56b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
56d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
56e0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  e osGetTempPathA
56f0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5700: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61  )(DWORD,LPSTR))a
5710: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
5720: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5730: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5740: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5750: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
5760: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
5770: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5780: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
5790: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hW,            0
57a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
57b0: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
57c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
57d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
57e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
57f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5800: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28  osGetTempPathW (
5810: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5820: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53  DWORD,LPWSTR))aS
5830: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72  yscall[32].pCurr
5840: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5850: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5860: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
5870: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5880: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c  LL)GetTickCount,
5890: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
58a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
58b0: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
58c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
58d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
58e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
58f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5900: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
5910: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
5920: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
5930: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5940: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5950: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5960: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5970: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5980: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
5990: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
59a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
59b0: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
59c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
59d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
59e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
59f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5a00: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
5a10: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5a20: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
5a30: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
5a40: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
5a50: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5a60: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5a70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5a80: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
5a90: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
5aa0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5ab0: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
5ac0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  W,           0 }
5ad0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5ae0: 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20  VersionExW",    
5af0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5b00: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5b10: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b20: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5b30: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28  GetVersionExW ((
5b40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5b50: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
5b60: 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63  SIONINFOW))aSysc
5b70: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
5b80: 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f  )..  { "HeapAllo
5b90: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
5ba0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41    (SYSCALL)HeapA
5bb0: 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20  lloc,           
5bc0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
5bd0: 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28  e osHeapAlloc ((
5be0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
5bf0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
5c00: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
5c10: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
5c20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5c30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5c40: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5c60: 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c  CALL)HeapCreate,
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
5c90: 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  apCreate",      
5ca0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5cb0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5cc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5cd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5ce0: 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41  sHeapCreate ((HA
5cf0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57  NDLE(WINAPI*)(DW
5d00: 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20  ORD,SIZE_T, \.  
5d10: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
5d20: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
5d30: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5d50: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
5d60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5d70: 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20  LL)HeapDestroy, 
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5d90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
5da0: 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20  Destroy",       
5db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5dd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5de0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
5df0: 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f  eapDestroy ((BOO
5e00: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5e10: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e  E))aSyscall[38].
5e20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5e30: 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20 20  HeapFree",      
5e40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5e50: 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20 20  LL)HeapFree,    
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5e70: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
5e80: 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Free ((BOOL(WINA
5e90: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
5ea0: 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61  D,LPVOID))aSysca
5eb0: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
5ec0: 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c  ..  { "HeapReAll
5ed0: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
5ee0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65   (SYSCALL)HeapRe
5ef0: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
5f00: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5f10: 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28   osHeapReAlloc (
5f20: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
5f30: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
5f40: 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  VOID, \.        
5f50: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
5f60: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
5f70: 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20    { "HeapSize", 
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5f90: 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65  SYSCALL)HeapSize
5fa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5fb0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5fc0: 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45  sHeapSize ((SIZE
5fd0: 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  _T(WINAPI*)(HAND
5fe0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
5ff0: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6000: 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65  scall[41].pCurre
6010: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6020: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6030: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
6040: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6050: 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20  L)HeapValidate, 
6060: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6070: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56  #else.  { "HeapV
6080: 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20  alidate",       
6090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
60c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
60d0: 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f  apValidate ((BOO
60e0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
60f0: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
6100: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
6110: 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e  call[42].pCurren
6120: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6130: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
6140: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6150: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
6160: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6170: 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74  CALL)HeapCompact
6180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
6190: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
61a0: 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20  apCompact",     
61b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
61c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
61d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
61e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
61f0: 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55  sHeapCompact ((U
6200: 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  INT(WINAPI*)(HAN
6210: 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63  DLE,DWORD))aSysc
6220: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
6230: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6240: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6250: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
6260: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6270: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6280: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
6290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
62a0: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
62b0: 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yA,            0
62c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
62d0: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
62e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
62f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6300: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6310: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6320: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28  osLoadLibraryA (
6330: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
6340: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
6350: 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[44].pCurrent)
6360: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6370: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
6380: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6390: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
63a0: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
63b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
63c0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
63d0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
63e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
63f0: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c  LL)LoadLibraryW,
6400: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6410: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6420: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
6430: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6440: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6450: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6460: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6470: 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d  oadLibraryW ((HM
6480: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6490: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
64a0: 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [45].pCurrent)..
64b0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
64c0: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  INRT.  { "LocalF
64d0: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
64e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
64f0: 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  alFree,         
6500: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6510: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
6520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6530: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6560: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72  define osLocalFr
6570: 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41  ee ((HLOCAL(WINA
6580: 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79  PI*)(HLOCAL))aSy
6590: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
65a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
65b0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
65c0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
65d0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
65f0: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20  SCALL)LockFile, 
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6610: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6620: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
6630: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6640: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6650: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6660: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6670: 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69  osLockFile.#defi
6680: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
6690: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
66a0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
66b0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
66c0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
66d0: 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[47].pCurrent).
66e0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
66f0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
6700: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6720: 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c  CALL)LockFileEx,
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6740: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
6750: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6760: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6770: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6780: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6790: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
67a0: 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66  sLockFileEx.#def
67b0: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  ine osLockFileEx
67c0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
67d0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
67e0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
67f0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6800: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6810: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
6820: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
6830: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
6840: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6850: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
6860: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20  ITE_OMIT_WAL)). 
6870: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6880: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
6890: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
68a0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
68b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
68c0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
68d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
68e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6900: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6910: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
6920: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
6930: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6940: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6950: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
6960: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
6970: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74  rent)..  { "Mult
6980: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22  iByteToWideChar"
6990: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ,     (SYSCALL)M
69a0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
69b0: 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ar,     0 },..#d
69c0: 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74  efine osMultiByt
69d0: 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e  eToWideChar ((in
69e0: 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c  t(WINAPI*)(UINT,
69f0: 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74  DWORD,LPCSTR,int
6a00: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
6a10: 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c     int))aSyscall
6a20: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
6a30: 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72    { "QueryPerfor
6a40: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28  manceCounter", (
6a50: 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72  SYSCALL)QueryPer
6a60: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c  formanceCounter,
6a70: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6a80: 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
6a90: 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28  eCounter ((BOOL(
6aa0: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
6ab0: 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
6ac0: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  R*))aSyscall[51]
6ad0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6ae0: 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20  "ReadFile",     
6af0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6b00: 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20  ALL)ReadFile,   
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6b20: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  ,..#define osRea
6b30: 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  dFile ((BOOL(WIN
6b40: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56  API*)(HANDLE,LPV
6b50: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
6b60: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
6b70: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
6b80: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
6b90: 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66  )..  { "SetEndOf
6ba0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6bb0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e    (SYSCALL)SetEn
6bc0: 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  dOfFile,        
6bd0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6be0: 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  e osSetEndOfFile
6bf0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6c00: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
6c10: 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[53].pCurrent).
6c20: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6c30: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
6c40: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
6c50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
6c60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20  tFilePointer,   
6c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6c80: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
6c90: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
6ca0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6cd0: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
6ce0: 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44  ePointer ((DWORD
6cf0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6d00: 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20  ,LONG,PLONG, \. 
6d10: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
6d20: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
6d30: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6d50: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
6d60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6d70: 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20  LL)Sleep,       
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65  .#else.  { "Slee
6da0: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
6db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6de0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
6df0: 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41  leep ((VOID(WINA
6e00: 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73  PI*)(DWORD))aSys
6e10: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
6e20: 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54  t)..  { "SystemT
6e30: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20  imeToFileTime", 
6e40: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74     (SYSCALL)Syst
6e50: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
6e60: 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ,    0 },..#defi
6e70: 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54  ne osSystemTimeT
6e80: 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  oFileTime ((BOOL
6e90: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
6ea0: 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20  SYSTEMTIME*, \. 
6eb0: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
6ec0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e  E))aSyscall[56].
6ed0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6ee0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
6ef0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
6f00: 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NRT.  { "UnlockF
6f10: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6f20: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
6f30: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
6f40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6f50: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
6f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
6f70: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
6fa0: 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69  fndef osUnlockFi
6fb0: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  le.#define osUnl
6fc0: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
6fd0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6fe0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6ff0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7000: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
7010: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
7020: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7030: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f  _WINCE.  { "Unlo
7040: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
7050: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
7060: 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  nlockFileEx,    
7070: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7080: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7090: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
70a0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
70d0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
70e0: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
70f0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7100: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7110: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
7120: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
7130: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
7140: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7150: 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65  WINCE || !define
7160: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7170: 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  L).  { "UnmapVie
7180: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
7190: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
71a0: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
71b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
71c0: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
71d0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
71e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7210: 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77  fine osUnmapView
7220: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
7230: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29  NAPI*)(LPCVOID))
7240: 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75  aSyscall[59].pCu
7250: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64  rrent)..  { "Wid
7260: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7270: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
7280: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
7290: 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  yte,     0 },..#
72a0: 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61  define osWideCha
72b0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69  rToMultiByte ((i
72c0: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
72d0: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69  ,DWORD,LPCWSTR,i
72e0: 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a  nt,LPSTR,int, \.
72f0: 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c          LPCSTR,L
7300: 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b  PBOOL))aSyscall[
7310: 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  60].pCurrent).. 
7320: 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20   { "WriteFile", 
7330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7340: 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65  YSCALL)WriteFile
7350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7360: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7370: 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c  WriteFile ((BOOL
7380: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7390: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  ,LPCVOID,DWORD,L
73a0: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
73b0: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
73c0: 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75  aSyscall[61].pCu
73d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
73e0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
73f0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
7400: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7410: 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45  ALL)CreateEventE
7420: 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  xW,          0 }
7430: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7440: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
7450: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7460: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7470: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7480: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7490: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20 28  CreateEventExW (
74a0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
74b0: 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  (LPSECURITY_ATTR
74c0: 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20  IBUTES,LPCWSTR, 
74d0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
74e0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
74f0: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
7500: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7510: 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NRT.  { "WaitFor
7520: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
7530: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
7540: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c  ForSingleObject,
7550: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7560: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7570: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
7580: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
75b0: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
75c0: 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57  ingleObject ((DW
75d0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
75e0: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  DLE, \.        D
75f0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
7600: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
7610: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
7620: 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  T.  { "WaitForSi
7630: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20  ngleObjectEx",  
7640: 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f   (SYSCALL)WaitFo
7650: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c  rSingleObjectEx,
7660: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7670: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
7680: 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59  ObjectEx",   (SY
7690: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
76b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
76c0: 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ine osWaitForSin
76d0: 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57  gleObjectEx ((DW
76e0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
76f0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
7700: 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63       BOOL))aSysc
7710: 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74  all[64].pCurrent
7720: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7730: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46  _WINRT.  { "SetF
7740: 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20  ilePointerEx",  
7750: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
7760: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c  etFilePointerEx,
7770: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7780: 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  se.  { "SetFileP
7790: 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20  ointerEx",      
77a0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
77d0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69  .#define osSetFi
77e0: 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f  lePointerEx ((BO
77f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7800: 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  LE,LARGE_INTEGER
7810: 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52  , \.        PLAR
7820: 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44  GE_INTEGER,DWORD
7830: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
7840: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7850: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7860: 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d  { "GetFileInform
7870: 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22  ationByHandleEx"
7880: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69  , (SYSCALL)GetFi
7890: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
78a0: 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65  andleEx, 0 },.#e
78b0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
78c0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
78d0: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
78e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
78f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7900: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
7910: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7920: 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28  HandleEx ((BOOL(
7930: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7940: 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f   \.        FILE_
7950: 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43  INFO_BY_HANDLE_C
7960: 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52  LASS,LPVOID,DWOR
7970: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e  D))aSyscall[66].
7980: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7990: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
79a0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
79b0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20  E_OMIT_WAL).  { 
79c0: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  "MapViewOfFileFr
79d0: 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 43  omApp",    (SYSC
79e0: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
79f0: 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d  eFromApp,    0 }
7a00: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
7a10: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7a20: 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  p",    (SYSCALL)
7a30: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7a40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7a50: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7a60: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
7a70: 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57 49  mApp ((LPVOID(WI
7a80: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c  NAPI*)(HANDLE,UL
7a90: 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20  ONG,ULONG64, \. 
7aa0: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
7ab0: 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72  Syscall[67].pCur
7ac0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7ad0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7ae0: 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20  CreateFile2",   
7af0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7b00: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c 20  LL)CreateFile2, 
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7b20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
7b30: 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20  teFile2",       
7b40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
7b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7b60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7b70: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
7b80: 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41 4e  reateFile2 ((HAN
7b90: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
7ba0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
7bb0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7bc0: 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32 5f    LPCREATEFILE2_
7bd0: 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
7be0: 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36 38  ERS))aSyscall[68
7bf0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7c00: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7c10: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
7c20: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
7c30: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
7c40: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
7c50: 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  y",     (SYSCALL
7c60: 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  )LoadPackagedLib
7c70: 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23  rary,     0 },.#
7c80: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61  else.  { "LoadPa
7c90: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20  ckagedLibrary", 
7ca0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7cd0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
7ce0: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
7cf0: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
7d00: 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20  I*)(LPCWSTR, \. 
7d10: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7d20: 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72  yscall[69].pCurr
7d30: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7d40: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
7d50: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20  etTickCount64", 
7d60: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7d70: 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  L)GetTickCount64
7d80: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
7d90: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 69  #else.  { "GetTi
7da0: 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20  ckCount64",     
7db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7de0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
7df0: 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28 55  tTickCount64 ((U
7e00: 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a  LONGLONG(WINAPI*
7e10: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
7e20: 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [70].pCurrent)..
7e30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7e40: 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74 69  NRT.  { "GetNati
7e50: 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20  veSystemInfo",  
7e60: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4e     (SYSCALL)GetN
7e70: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c  ativeSystemInfo,
7e80: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7e90: 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79    { "GetNativeSy
7ea0: 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28  stemInfo",     (
7eb0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7ee0: 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69 76  efine osGetNativ
7ef0: 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f  eSystemInfo ((VO
7f00: 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  ID(WINAPI*)( \. 
7f10: 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 5f         LPSYSTEM_
7f20: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37  INFO))aSyscall[7
7f30: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
7f40: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7f50: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
7f60: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
7f70: 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20  gStringA",      
7f80: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
7f90: 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20 20  ebugStringA,    
7fa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7fb0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
7fc0: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
7fd0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7ff0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8000: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
8010: 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28 57  StringA ((VOID(W
8020: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
8030: 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75  aSyscall[72].pCu
8040: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
8050: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8060: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
8070: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8080: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
8090: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
80a0: 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  ringW,      0 },
80b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
80c0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c  utDebugStringW",
80d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
80e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8100: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
8110: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8120: 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  W ((VOID(WINAPI*
8130: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
8140: 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74  all[73].pCurrent
8150: 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 65  )..  { "GetProce
8160: 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20 20  ssHeap",        
8170: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
8180: 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20 20  ocessHeap,      
8190: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
81a0: 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65  e osGetProcessHe
81b0: 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  ap ((HANDLE(WINA
81c0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
81d0: 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74  all[74].pCurrent
81e0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
81f0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
8200: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
8210: 41 4c 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  AL).  { "CreateF
8220: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
8230: 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 43 72 65  p", (SYSCALL)Cre
8240: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8250: 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73  omApp, 0 },.#els
8260: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
8270: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22  eMappingFromApp"
8280: 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20  , (SYSCALL)0,   
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
82b0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
82c0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
82d0: 70 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  pp ((HANDLE(WINA
82e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20  PI*)(HANDLE, \. 
82f0: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
8300: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 55 4c 4f  Y_ATTRIBUTES,ULO
8310: 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53  NG,ULONG64,LPCWS
8320: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d  TR))aSyscall[75]
8330: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f  .pCurrent)..}; /
8340: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65  * End of the ove
8350: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
8360: 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   calls */../*.**
8370: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
8380: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
8390: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
83a0: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
83b0: 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46  he.** "win32" VF
83c0: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
83d0: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
83e0: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
83f0: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
8400: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
8410: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
8420: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
8430: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
8440: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
8450: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
8460: 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73  ic int winSetSys
8470: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
8480: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
8490: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
84a0: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
84b0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
84c0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
84d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
84e0: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
84f0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
8500: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
8510: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
8520: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
8530: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
8540: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
8550: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
8560: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
8570: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
8580: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
8590: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
85a0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
85b0: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
85c0: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
85d0: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
85e0: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
85f0: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
8600: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
8610: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
8620: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
8630: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
8640: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
8650: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
8660: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
8670: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
8680: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
8690: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
86a0: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
86b0: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
86c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
86d0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
86e0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
86f0: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
8700: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
8710: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
8720: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
8730: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
8740: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
8750: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
8760: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
8770: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
8780: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
8790: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
87a0: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
87b0: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
87c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
87d0: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
87e0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
87f0: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
8800: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
8810: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
8820: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
8830: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
8840: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
8850: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
8860: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
8870: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
8880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8890: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
88a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
88b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
88c0: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
88d0: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
88e0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
88f0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
8900: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
8910: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
8920: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
8930: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
8940: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
8950: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
8960: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
8970: 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65  yscall_ptr winGe
8980: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
8990: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
89a0: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
89b0: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
89c0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
89d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
89e0: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
89f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
8a00: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
8a10: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
8a20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8a30: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
8a40: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
8a50: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
8a60: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
8a70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
8a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8a90: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
8aa0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
8ab0: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
8ac0: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
8ad0: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
8ae0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8af0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
8b00: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
8b10: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
8b20: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
8b30: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
8b40: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
8b50: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
8b60: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
8b70: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8b80: 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61  *winNextSystemCa
8b90: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
8ba0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
8bb0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
8bc0: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
8bd0: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
8be0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
8bf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
8c00: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
8c10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
8c20: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
8c30: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
8c40: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
8c50: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
8c60: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
8c70: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
8c80: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
8c90: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
8ca0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
8cb0: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
8cc0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8cd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
8ce0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
8cf0: 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69   If a Win32 nati
8d00: 76 65 20 68 65 61 70 20 68 61 73 20 62 65 65 6e  ve heap has been
8d10: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69   configured, thi
8d20: 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
8d30: 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f  attempt to.** co
8d40: 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f 6e 20  mpact it.  Upon 
8d50: 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
8d60: 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  OK will be retur
8d70: 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69 6c 75  ned.  Upon failu
8d80: 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51  re, one.** of SQ
8d90: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49  LITE_NOMEM, SQLI
8da0: 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53 51 4c  TE_ERROR, or SQL
8db0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77 69 6c  ITE_NOTFOUND wil
8dc0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
8dd0: 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67 65 73  The.** "pnLarges
8de0: 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  t" argument, if 
8df0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20 62  non-zero, will b
8e00: 65 20 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e  e used to return
8e10: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
8e20: 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f 6d 6d  .** largest comm
8e30: 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f 63 6b  itted free block
8e40: 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20 69 6e   in the heap, in
8e50: 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   bytes..*/.int s
8e60: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63 6f 6d  qlite3_win32_com
8e70: 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49 4e 54  pact_heap(LPUINT
8e80: 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20 20 69   pnLargest){.  i
8e90: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
8ea0: 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72 67 65  K;.  UINT nLarge
8eb0: 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45  st = 0;.  HANDLE
8ec0: 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65   hHeap;..  winMe
8ed0: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
8ee0: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
8ef0: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
8f00: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
8f10: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
8f20: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
8f30: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
8f40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
8f50: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8f60: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
8f70: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
8f80: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
8f90: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
8fa0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
8fb0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
8fc0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
8fd0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
8fe0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
8ff0: 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65 61 70  (nLargest=osHeap
9000: 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c 20 53  Compact(hHeap, S
9010: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9020: 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b 0a 20  _FLAGS))==0 ){. 
9030: 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
9040: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
9050: 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28 20 6c  ror();.    if( l
9060: 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52  astErrno==NO_ERR
9070: 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OR ){.      sqli
9080: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9090: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
90a0: 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 6e 6f   HeapCompact (no
90b0: 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d 25 70   space), heap=%p
90c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
90d0: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
90e0: 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  p);.      rc = S
90f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9110: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9120: 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20  _ERROR, "failed 
9130: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
9140: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9160: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
9170: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
9180: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
9190: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
91a0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71  }.  }.#else.  sq
91b0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
91c0: 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c  _NOTFOUND, "fail
91d0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
91e0: 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  t, heap=%p",.   
91f0: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
9200: 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d  *)hHeap);.  rc =
9210: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
9220: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
9230: 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61  nLargest ) *pnLa
9240: 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74  rgest = nLargest
9250: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9260: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  ../*.** If a Win
9270: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
9280: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
9290: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
92a0: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
92b0: 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64  o.** destroy and
92c0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20 49   recreate it.  I
92d0: 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  f the Win32 nati
92e0: 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69  ve heap is not i
92f0: 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a  solated and/or.*
9300: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65  * the sqlite3_me
9310: 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63  mory_used() func
9320: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
9330: 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54  turn zero, SQLIT
9340: 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62  E_BUSY will.** b
9350: 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  e returned and n
9360: 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  o changes will b
9370: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69  e made to the Wi
9380: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e  n32 native heap.
9390: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
93a0: 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70  win32_reset_heap
93b0: 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  (){.  int rc;.  
93c0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
93d0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
93e0: 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61  ter; ) /* The ma
93f0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
9400: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
9410: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
9420: 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54  *pMem; )    /* T
9430: 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63  he memsys static
9440: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
9450: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
9460: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
9470: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
9480: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
9490: 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  ; ).  MUTEX_LOGI
94a0: 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65  C( pMem = sqlite
94b0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
94c0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
94d0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
94e0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
94f0: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
9500: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
9510: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
9520: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
9530: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
9540: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
9550: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
9560: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
9570: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
9580: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
9590: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
95a0: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
95b0: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
95c0: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
95d0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
95e0: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
95f0: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
9600: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
9610: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
9620: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
9630: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
9640: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
9650: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
9660: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
9670: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
9680: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
9690: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
96a0: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
96b0: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
96c0: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
96d0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
96e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
96f0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
9700: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
9710: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
9720: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
9730: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
9740: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
9750: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
9760: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
9770: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
9780: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
9790: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
97a0: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
97b0: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
97c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
97d0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
97e0: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
97f0: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
9800: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
9810: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9820: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
9830: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
9840: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9850: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
9860: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
9870: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
9880: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9890: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
98a0: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
98b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
98c0: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
98d0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
98e0: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
98f0: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
9900: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
9910: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
9920: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
9930: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
9940: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
9950: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
9960: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
9970: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
9980: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9990: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
99a0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
99b0: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
99c0: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
99d0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
99e0: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
99f0: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
9a00: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
9a10: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
9a20: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
9a30: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
9a40: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
9a50: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
9a60: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
9a70: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
9a80: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
9a90: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
9aa0: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
9ab0: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
9ac0: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
9ad0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
9ae0: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
9af0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
9b00: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
9b10: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
9b20: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
9b30: 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ZE );.#if define
9b40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
9b50: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
9b60: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
9b70: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
9b80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
9b90: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
9ba0: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
9bb0: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
9bc0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
9bd0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
9be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
9bf0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
9c00: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
9c10: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
9c20: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
9c30: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
9c40: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
9c50: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
9c60: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
9c70: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
9c80: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
9c90: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
9ca0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
9cb0: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
9cc0: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
9cd0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
9ce0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
9cf0: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
9d00: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
9d10: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
9d20: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
9d30: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
9d40: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
9d50: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
9d60: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
9d70: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
9d80: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
9d90: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
9da0: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
9db0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
9dc0: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
9dd0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
9de0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
9df0: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
9e00: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
9e10: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
9e20: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
9e30: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
9e40: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
9e50: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
9e60: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
9e70: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
9e80: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
9e90: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
9ea0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
9eb0: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
9ec0: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
9ed0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
9ee0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
9ef0: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
9f00: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
9f10: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
9f20: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
9f30: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
9f40: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
9f50: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
9f60: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
9f70: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
9fa0: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
9fb0: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
9fc0: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
9fd0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
9fe0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
9ff0: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
a000: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
a010: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
a020: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
a030: 20 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f   Return true (no
a040: 6e 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72  n-zero) if we ar
a050: 65 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20  e running under 
a060: 57 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69  WinNT, Win2K, Wi
a070: 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45  nXP,.** or WinCE
a080: 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
a090: 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35  (zero) for Win95
a0a0: 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d  , Win98, or WinM
a0b0: 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73  E..**.** Here is
a0c0: 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20   an interesting 
a0d0: 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69  observation:  Wi
a0e0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20  n95, Win98, and 
a0f0: 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68  WinME lack.** th
a100: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
a110: 50 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20  PI.  But we can 
a120: 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79  still statically
a130: 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68   link against th
a140: 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e  at.** API as lon
a150: 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61  g as we don't ca
a160: 6c 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69  ll it when runni
a170: 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20  ng Win95/98/ME. 
a180: 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68   A call to.** th
a190: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
a1a0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
a1b0: 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57  if the host is W
a1c0: 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a  in95/98/ME or.**
a1d0: 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20   WinNT/2K/XP so 
a1e0: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f  that we will kno
a1f0: 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  w whether or not
a200: 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63   we can safely c
a210: 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46  all.** the LockF
a220: 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a  ileEx() API..*/.
a230: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
a240: 4e 38 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44  N8.#  define NTD
a250: 44 49 5f 57 49 4e 38 20 20 20 20 20 20 20 20 20  DI_WIN8         
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
a270: 78 30 36 30 32 30 30 30 30 0a 23 65 6e 64 69 66  x06020000.#endif
a280: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
a290: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
a2a0: 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66  OS_WINRT || !def
a2b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a2c0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65  2_HAS_ANSI).# de
a2d0: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
a2e0: 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  1).#elif !define
a2f0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a300: 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e  AS_WIDE).# defin
a310: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a  e osIsNT()  (0).
a320: 23 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69  #else.  static i
a330: 6e 74 20 6f 73 49 73 4e 54 28 76 6f 69 64 29 7b  nt osIsNT(void){
a340: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
a350: 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 23  _os_type==0 ){.#
a360: 69 66 20 64 65 66 69 6e 65 64 28 4e 54 44 44 49  if defined(NTDDI
a370: 5f 56 45 52 53 49 4f 4e 29 20 26 26 20 4e 54 44  _VERSION) && NTD
a380: 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54  DI_VERSION >= NT
a390: 44 44 49 5f 57 49 4e 38 0a 20 20 20 20 20 20 4f  DDI_WIN8.      O
a3a0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49  SVERSIONINFOW sI
a3b0: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f  nfo;.      sInfo
a3c0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
a3d0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
a3e0: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65  nfo);.      osGe
a3f0: 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e  tVersionExW(&sIn
a400: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  fo);.#else.     
a410: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20   OSVERSIONINFOA 
a420: 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e  sInfo;.      sIn
a430: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
a440: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
a450: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73  sInfo);.      os
a460: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73  GetVersionExA(&s
a470: 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Info);.#endif.  
a480: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74      sqlite3_os_t
a490: 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c  ype = sInfo.dwPl
a4a0: 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c  atformId==VER_PL
a4b0: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20  ATFORM_WIN32_NT 
a4c0: 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  ? 2 : 1;.    }. 
a4d0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
a4e0: 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20  3_os_type==2;.  
a4f0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
a500: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
a510: 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  LLOC./*.** Alloc
a520: 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65  ate nBytes of me
a530: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
a540: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
a550: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  oc(int nBytes){.
a560: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
a570: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
a580: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a590: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
a5a0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
a5b0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
a5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
a5d0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
a5e0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
a5f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
a600: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
a610: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
a620: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
a630: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
a640: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
a650: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a660: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
a670: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
a680: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d  ytes>=0 );.  p =
a690: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
a6a0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
a6b0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
a6c0: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
a6d0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
a6e0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a6f0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
a700: 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20  to HeapAlloc %u 
a710: 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61  bytes (%lu), hea
a720: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
a730: 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f         nBytes, o
a740: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
a750: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
a760: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
a770: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
a780: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
a790: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
a7a0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20  void *pPrior){. 
a7b0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
a7c0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
a7d0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
a7e0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
a7f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
a800: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
a810: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
a820: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
a830: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
a840: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
a850: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
a860: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
a870: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
a880: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
a890: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
a8a0: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
a8b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
a8c0: 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  !pPrior ) return
a8d0: 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c  ; /* Passing NUL
a8e0: 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73  L to HeapFree is
a8f0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20   undefined. */. 
a900: 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65   if( !osHeapFree
a910: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
a920: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
a930: 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20   pPrior) ){.    
a940: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
a950: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
a960: 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c  d to HeapFree bl
a970: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
a980: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
a990: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
a9a0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
a9b0: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
a9c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
a9d0: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
a9e0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
a9f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
aa00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
aa10: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
aa20: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
aa30: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
aa40: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
aa50: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
aa60: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
aa70: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
aa80: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
aa90: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
aaa0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
aab0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
aac0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
aad0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
aae0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
aaf0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
ab00: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
ab10: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
ab20: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
ab30: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
ab40: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
ab50: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
ab60: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
ab70: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
ab80: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
ab90: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
aba0: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
abb0: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
abc0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
abd0: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
abe0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
abf0: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
ac00: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
ac10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
ac20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
ac30: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
ac40: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
ac50: 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68  u bytes (%lu), h
ac60: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
ac70: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
ac80: 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20  ? "HeapReAlloc" 
ac90: 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e  : "HeapAlloc", n
aca0: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
acb0: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
acc0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
acd0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
ace0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
acf0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
ad00: 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   of an outstandi
ad10: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  ng allocation, i
ad20: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
ad30: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
ad40: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41  e(void *p){.  HA
ad50: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49  NDLE hHeap;.  SI
ad60: 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65  ZE_T n;..  winMe
ad70: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
ad80: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
ad90: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
ada0: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
adb0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
adc0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
add0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
ade0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
adf0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ae00: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
ae10: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
ae20: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
ae30: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
ae40: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ae50: 20 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20   p) );.#endif.  
ae60: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
ae70: 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53  0;.  n = osHeapS
ae80: 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ize(hHeap, SQLIT
ae90: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
aea0: 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d  GS, p);.  if( n=
aeb0: 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20  =(SIZE_T)-1 ){. 
aec0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
aed0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
aee0: 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65  iled to HeapSize
aef0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
af00: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
af10: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73             p, os
af20: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
af30: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
af40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
af50: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
af60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
af70: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
af80: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
af90: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
afa0: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
afb0: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
afc0: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
afd0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
afe0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
aff0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
b000: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
b010: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
b020: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
b030: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
b040: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
b050: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
b060: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
b070: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
b080: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
b090: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57  mData->magic1==W
b0a0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a  INMEM_MAGIC1 );.
b0b0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
b0c0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57  mData->magic2==W
b0d0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a  INMEM_MAGIC2 );.
b0e0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
b0f0: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
b100: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
b110: 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  E.  if( !pWinMem
b120: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
b130: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
b140: 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72  hHeap = osHeapCr
b150: 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33  eate(SQLITE_WIN3
b160: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20  2_HEAP_FLAGS,.  
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b190: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
b1a0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c  _HEAP_INIT_SIZE,
b1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
b1e0: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
b1f0: 45 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69  E);.    if( !pWi
b200: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
b210: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b220: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
b230: 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61  M,.          "fa
b240: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61  iled to HeapCrea
b250: 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d  te (%lu), flags=
b260: 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c  %u, initSize=%u,
b270: 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20   maxSize=%u",.  
b280: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
b290: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
b2a0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b2b0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  S,.          SQL
b2c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
b2d0: 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45  NIT_SIZE, SQLITE
b2e0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
b2f0: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74  SIZE);.      ret
b300: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b310: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
b320: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
b330: 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65  = TRUE;.    asse
b340: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
b350: 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  >bOwned );.  }.#
b360: 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61  else.  pWinMemDa
b370: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65  ta->hHeap = osGe
b380: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a  tProcessHeap();.
b390: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
b3a0: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
b3b0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b3c0: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
b3d0: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65     "failed to Ge
b3e0: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c  tProcessHeap (%l
b3f0: 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  u)", osGetLastEr
b400: 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75  ror());.    retu
b410: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b420: 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61  .  }.  pWinMemDa
b430: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c  ta->bOwned = FAL
b440: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  SE;.  assert( !p
b450: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
b460: 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ed );.#endif.  a
b470: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
b480: 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a  ta->hHeap!=0 );.
b490: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
b4a0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e  mData->hHeap!=IN
b4b0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
b4c0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
b4d0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
b4e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b4f0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
b500: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
b510: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
b520: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
b530: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b540: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
b550: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
b560: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b570: 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c  ./*.** Deinitial
b580: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
b590: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b5a0: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
b5b0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
b5c0: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
b5d0: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
b5e0: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
b5f0: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
b600: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
b610: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
b620: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d  MemData->magic1=
b630: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
b640: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
b650: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d  MemData->magic2=
b660: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29  =WINMEM_MAGIC2 )
b670: 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d  ;..  if( pWinMem
b680: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
b690: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
b6a0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49  emData->hHeap!=I
b6b0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b6c0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b6d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b6e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b6f0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b700: 41 54 45 29 0a 20 20 20 20 61 73 73 65 72 74 28  ATE).    assert(
b710: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b720: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
b730: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b740: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
b750: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  L) );.#endif.   
b760: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
b770: 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20  ->bOwned ){.    
b780: 20 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73    if( !osHeapDes
b790: 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61  troy(pWinMemData
b7a0: 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20  ->hHeap) ){.    
b7b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b7c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
b7d0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73  ailed to HeapDes
b7e0: 74 72 6f 79 20 28 25 6c 75 29 2c 20 68 65 61 70  troy (%lu), heap
b7f0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
b800: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
b810: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
b820: 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  d*)pWinMemData->
b830: 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a  hHeap);.      }.
b840: 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74        pWinMemDat
b850: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53  a->bOwned = FALS
b860: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  E;.    }.    pWi
b870: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
b880: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = NULL;.  }.}../
b890: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
b8a0: 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f  e low-level memo
b8b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75  ry allocation fu
b8c0: 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20  nction pointers 
b8d0: 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f  in.** sqlite3Glo
b8e0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68  balConfig.m with
b8f0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
b900: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
b910: 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61  s file. The.** a
b920: 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79  rguments specify
b930: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65   the block of me
b940: 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a  mory to manage..
b950: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
b960: 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
b970: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e  d by sqlite3_con
b980: 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65  fig(), and there
b990: 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72  fore.** is not r
b9a0: 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 74 68  equired to be th
b9b0: 72 65 61 64 73 61 66 65 20 28 69 74 20 69 73 20  readsafe (it is 
b9c0: 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  not)..*/.const s
b9d0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
b9e0: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
b9f0: 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20  tWin32(void){.  
ba00: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
ba10: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
ba20: 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d   winMemMethods =
ba30: 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c   {.    winMemMal
ba40: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46  loc,.    winMemF
ba50: 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ree,.    winMemR
ba60: 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  ealloc,.    winM
ba70: 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d  emSize,.    winM
ba80: 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77  emRoundup,.    w
ba90: 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77  inMemInit,.    w
baa0: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20  inMemShutdown,. 
bab0: 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61     &win_mem_data
bac0: 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26  .  };.  return &
bad0: 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d  winMemMethods;.}
bae0: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65  ..void sqlite3Me
baf0: 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64  mSetDefault(void
bb00: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  ){.  sqlite3_con
bb10: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
bb20: 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65  G_MALLOC, sqlite
bb30: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b  3MemGetWin32());
bb40: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
bb50: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
bb60: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65   */../*.** Conve
bb70: 72 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  rt a UTF-8 strin
bb80: 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55  g to Microsoft U
bb90: 6e 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29  nicode (UTF-16?)
bba0: 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  . .**.** Space t
bbb0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
bbc0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
bbd0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
bbe0: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50  oc..*/.static LP
bbf0: 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e  WSTR winUtf8ToUn
bc00: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
bc10: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
bc20: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
bc30: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
bc40: 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73  e;..  nChar = os
bc50: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
bc60: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
bc70: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
bc80: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
bc90: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
bca0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
bcb0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
bcc0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
bcd0: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
bce0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
bcf0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
bd00: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
bd10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
bd20: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
bd30: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
bd40: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
bd50: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
bd60: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29            nChar)
bd90: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
bda0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
bdb0: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
bdc0: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
bdd0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
bde0: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
bdf0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
be00: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
be10: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
be20: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
be30: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
be40: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
be50: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
be60: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
be70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
be80: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c  nUnicodeToUtf8(L
be90: 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65  PCWSTR zWideFile
bea0: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79  name){.  int nBy
beb0: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  te;.  char *zFil
bec0: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20  ename;..  nByte 
bed0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
bee0: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
bef0: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
bf00: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
bf10: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
bf20: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
bf30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
bf40: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
bf50: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
bf60: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
bf70: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
bf80: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
bf90: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
bfa0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
bfb0: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
bfc0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
bfd0: 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20  name, nByte,.   
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
c000: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
c010: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
c020: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
c030: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
c040: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
c050: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
c060: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
c070: 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20   an ANSI string 
c080: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
c090: 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74  code, based on t
c0a0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f  he.** current co
c0b0: 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20  depage settings 
c0c0: 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a  for file apis..*
c0d0: 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  * .** Space to h
c0e0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
c0f0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
c100: 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69  ned.** from sqli
c110: 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  te3_malloc..*/.s
c120: 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e  tatic LPWSTR win
c130: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f  MbcsToUnicode(co
c140: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
c150: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
c160: 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63  e;.  LPWSTR zMbc
c170: 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  sFilename;.  int
c180: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
c190: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
c1a0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
c1b0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
c1c0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
c1d0: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
c1e0: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
c1f0: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f          0)*sizeo
c220: 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20  f(WCHAR);.  if( 
c230: 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
c240: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c250: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
c260: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
c270: 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
c280: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d  zMbcsFilename[0]
c290: 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73  ) );.  if( zMbcs
c2a0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
c2b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c2c0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c  .  nByte = osMul
c2d0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
c2e0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46  (codepage, 0, zF
c2f0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62  ilename, -1, zMb
c300: 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  csFilename,.    
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
c330: 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  e);.  if( nByte=
c340: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
c350: 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65  3_free(zMbcsFile
c360: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73  name);.    zMbcs
c370: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
c380: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73  }.  return zMbcs
c390: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
c3a0: 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f  ** Convert Micro
c3b0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20  soft Unicode to 
c3c0: 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61  multi-byte chara
c3d0: 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73  cter string, bas
c3e0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65  ed on the.** use
c3f0: 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67  r's ANSI codepag
c400: 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  e..**.** Space t
c410: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
c420: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
c430: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
c440: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
c450: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
c460: 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63  *winUnicodeToMbc
c470: 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46  s(LPCWSTR zWideF
c480: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
c490: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
c4a0: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Filename;.  int 
c4b0: 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65  codepage = osAre
c4c0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
c4d0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
c4e0: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  CP;..  nByte = o
c4f0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
c500: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
c510: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c520: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
c530: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c540: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
c550: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
c560: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
c570: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
c580: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
c590: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c5a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
c5b0: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
c5c0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
c5d0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
c5e0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
c5f0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c610: 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30       nByte, 0, 0
c620: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
c630: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
c640: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  e3_free(zFilenam
c650: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e);.    zFilenam
c660: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
c670: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  urn zFilename;.}
c680: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
c690: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
c6a0: 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ter string to UT
c6b0: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
c6c0: 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  old the.** retur
c6d0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
c6e0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
c6f0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
c700: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
c710: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
c720: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
c730: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
c740: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
c750: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
c760: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
c770: 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f  = winMbcsToUnico
c780: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
c790: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
c7a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c7b0: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
c7c0: 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f  eUtf8 = winUnico
c7d0: 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64  deToUtf8(zTmpWid
c7e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
c7f0: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
c800: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
c810: 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Utf8;.}../*.** C
c820: 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20  onvert UTF-8 to 
c830: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
c840: 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61  ter string.  Spa
c850: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a  ce to hold the .
c860: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
c870: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
c880: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
c890: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
c8a0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
c8b0: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
c8c0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
c8d0: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
c8e0: 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54  ameMbcs;.  LPWST
c8f0: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
c900: 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66  TmpWide = winUtf
c910: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
c920: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
c930: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
c940: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c950: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20  zFilenameMbcs = 
c960: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
c970: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
c980: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
c990: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
c9a0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a  FilenameMbcs;.}.
c9b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
c9c0: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61  tion sets the da
c9d0: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
c9e0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
c9f0: 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e  rectory based on
ca00: 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64  .** the provided
ca10: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
ca20: 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d   type argument m
ca30: 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65  ust be 1 in orde
ca40: 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20  r to set the.** 
ca50: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
ca60: 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  r 2 in order to 
ca70: 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72  set the temporar
ca80: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68  y directory.  Th
ca90: 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75  e zValue.** argu
caa0: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
cab0: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
cac0: 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72  y to use.  The r
cad0: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c  eturn value will
cae0: 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   be.** SQLITE_OK
caf0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
cb00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
cb10: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
cb20: 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c  ry(DWORD type, L
cb30: 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a  PCWSTR zValue){.
cb40: 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63    char **ppDirec
cb50: 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  tory = 0;.#ifnde
cb60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
cb70: 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20  TOINIT.  int rc 
cb80: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
cb90: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
cba0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
cbb0: 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d  ndif.  if( type=
cbc0: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
cbd0: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
cbe0: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
cbf0: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
cc00: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a  data_directory;.
cc10: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65    }else if( type
cc20: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
cc30: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
cc40: 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65  PE ){.    ppDire
cc50: 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33  ctory = &sqlite3
cc60: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
cc70: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
cc80: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74  ppDirectory || t
cc90: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
cca0: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
ccb0: 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20  _TYPE.          
ccc0: 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  || type==SQLITE_
ccd0: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
cce0: 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20  TORY_TYPE.  );. 
ccf0: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
cd00: 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33  ctory || sqlite3
cd10: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
cd20: 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45  *ppDirectory, ME
cd30: 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20  MTYPE_HEAP) );. 
cd40: 20 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79   if( ppDirectory
cd50: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56   ){.    char *zV
cd60: 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20  alueUtf8 = 0;.  
cd70: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20    if( zValue && 
cd80: 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20  zValue[0] ){.   
cd90: 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20     zValueUtf8 = 
cda0: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
cdb0: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
cdc0: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
cdd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
cde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
cdf0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
ce00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ce10: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b  e(*ppDirectory);
ce20: 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72  .    *ppDirector
ce30: 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a  y = zValueUtf8;.
ce40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce50: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
ce60: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
ce70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
ce80: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69  turn value of wi
ce90: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
cea0: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
ceb0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
cec0: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
ced0: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
cee0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
cef0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
cf00: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
cf10: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
cf20: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
cf30: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
cf40: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
cf50: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
cf60: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
cf70: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
cf80: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
cf90: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
cfa0: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
cfb0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
cfc0: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
cfd0: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
cfe0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
cff0: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
d000: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
d010: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
d020: 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
d030: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
d040: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
d050: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c  AR zTempWide[SQL
d060: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
d070: 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20  RMSG_CHARS+1];. 
d080: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
d090: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
d0a0: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
d0b0: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0d0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
d0e0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
d0f0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
d100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d110: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
d120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d130: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65               zTe
d180: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
d1b0: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
d1c0: 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  RS,.            
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
d1f0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
d200: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
d210: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
d220: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
d230: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
d240: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
d270: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
d2a0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
d2b0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
d300: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
d350: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
d3a0: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
d3b0: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
d3c0: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
d3d0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
d3e0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
d3f0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
d400: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
d410: 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
d420: 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64  eToUtf8(zTempWid
d430: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
d440: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
d450: 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  ();.#if !SQLITE_
d460: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f  OS_WINRT.      /
d470: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
d480: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
d490: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
d4a0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
d4b0: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69  ocalFree(zTempWi
d4c0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
d4d0: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
d4e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
d4f0: 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
d500: 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c  har *zTemp = NUL
d510: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
d520: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28  sFormatMessageA(
d530: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
d540: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
d550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
d570: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
d580: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
d5b0: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
d5c0: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
d610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d630: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
d650: 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20  LPSTR) &zTemp,. 
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d670: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
d6a0: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
d6b0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
d6c0: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
d6d0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
d6e0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
d6f0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
d700: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
d710: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
d720: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
d730: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  (zTemp);.      s
d740: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
d750: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f  alloc();.      /
d760: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
d770: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
d780: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
d790: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
d7a0: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
d7b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
d7c0: 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  f.  if( 0 == dwL
d7d0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
d7e0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
d7f0: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
d800: 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61  0x%lx (%lu)", la
d810: 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72  stErrno, lastErr
d820: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
d830: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
d840: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
d850: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
d860: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
d870: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
d880: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
d890: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
d8a0: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
d8b0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
d8c0: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
d8d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
d8e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d8f0: 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72  tion - winLogErr
d900: 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20  orAtLine() - is 
d910: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
d920: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
d930: 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e  * winLogError().
d940: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d950: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
d960: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
d970: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
d980: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f  nction..** It lo
d990: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
d9a0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
d9b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
d9c0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
d9d0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
d9e0: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
d9f0: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
da00: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
da10: 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65  rom .** FormatMe
da20: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssage..**.** The
da30: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
da40: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61  passed to the ma
da50: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68  cro should be th
da60: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61  e error code tha
da70: 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74  t.** will be ret
da80: 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
da90: 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (e.g. SQLITE_IOE
daa0: 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54  RR_DELETE, SQLIT
dab0: 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a  E_CANTOPEN). .**
dac0: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
dad0: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
dae0: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
daf0: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
db00: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
db10: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
db20: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
db30: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
db40: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
db50: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
db60: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
db70: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
db80: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
db90: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
dba0: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
dbb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dbc0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
dbd0: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
dbe0: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
dc10: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
dc20: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
dc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
dc40: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
dc50: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
dc60: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
dc70: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
dc80: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
dc90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
dca0: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
dcb0: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
dcc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
dcd0: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
dce0: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
dcf0: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
dd00: 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
dd20: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
dd30: 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
dd40: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd60: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
dd70: 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
dd80: 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
dd90: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
dda0: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
ddb0: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
ddc0: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
ddd0: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
dde0: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
ddf0: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
de00: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
de10: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
de20: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
de30: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
de40: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
de50: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
de60: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
de70: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
de80: 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
de90: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
dea0: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
deb0: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
dec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
ded0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
dee0: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
def0: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
df00: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
df10: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
df20: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
df30: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
df40: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
df50: 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73   .** antivirus s
df60: 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74  oftware.  Also t
df70: 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79  he initial delay
df80: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
df90: 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20  t retry..** The 
dfa0: 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20  delay increases 
dfb0: 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61  linearly with ea
dfc0: 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66  ch retry..*/.#if
dfd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
dfe0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20  2_IOERR_RETRY.# 
dff0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
e000: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20  N32_IOERR_RETRY 
e010: 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  10.#endif.#ifnde
e020: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
e030: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
e040: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
e050: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
e060: 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64  RY_DELAY 25.#end
e070: 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  if.static int wi
e080: 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51  nIoerrRetry = SQ
e090: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
e0a0: 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69  _RETRY;.static i
e0b0: 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79  nt winIoerrRetry
e0c0: 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57  Delay = SQLITE_W
e0d0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e0e0: 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49  _DELAY;../*.** I
e0f0: 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f  f a ReadFile() o
e100: 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72  r WriteFile() er
e110: 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f  ror occurs, invo
e120: 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
e130: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ** to see if it 
e140: 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65  should be retrie
e150: 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  d.  Return TRUE 
e160: 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72  to retry.  Retur
e170: 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69  n FALSE.** to gi
e180: 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72  ve up with an er
e190: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
e1a0: 6e 74 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  nt winRetryIoerr
e1b0: 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44  (int *pnRetry, D
e1c0: 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20  WORD *pError){. 
e1d0: 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
e1e0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
e1f0: 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e  f( *pnRetry>=win
e200: 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
e210: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
e220: 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
e230: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
e240: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
e250: 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53   e==ERROR_ACCESS
e260: 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20  _DENIED ||.     
e270: 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56   e==ERROR_LOCK_V
e280: 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20  IOLATION ||.    
e290: 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49    e==ERROR_SHARI
e2a0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a  NG_VIOLATION ){.
e2b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
e2c0: 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72  2_sleep(winIoerr
e2d0: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
e2e0: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
e2f0: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
e300: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
e310: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
e320: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d  *pError = e;.  }
e330: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e340: 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20  /*.** Log a I/O 
e350: 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73  error retry epis
e360: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
e370: 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  oid winLogIoerr(
e380: 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69  int nRetry){.  i
e390: 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20  f( nRetry ){.   
e3a0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
e3b0: 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20  ITE_IOERR, .    
e3c0: 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20    "delayed %dms 
e3d0: 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67  for lock/sharing
e3e0: 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20   conflict",.    
e3f0: 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44    winIoerrRetryD
e400: 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65  elay*nRetry*(nRe
e410: 74 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a  try+1)/2.    );.
e420: 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54    }.}..#if SQLIT
e430: 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a  E_OS_WINCE./****
e440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e480: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65  *****.** This se
e490: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63  ction contains c
e4a0: 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e  ode for WinCE on
e4b0: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ly..*/.#if !defi
e4c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f  ned(SQLITE_MSVC_
e4d0: 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c  LOCALTIME_API) |
e4e0: 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  | !SQLITE_MSVC_L
e4f0: 4f 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a  OCALTIME_API./*.
e500: 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20  ** The MSVC CRT 
e510: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61  on Windows CE ma
e520: 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  y not have a loc
e530: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
e540: 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65  n.  So.** create
e550: 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a   a substitute..*
e560: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
e570: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
e580: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
e590: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
e5a0: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
e5b0: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
e5c0: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
e5d0: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
e5e0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
e5f0: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
e600: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
e610: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
e620: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
e630: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
e640: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
e650: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
e660: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
e670: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
e680: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
e690: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
e6a0: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
e6b0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
e6c0: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
e6d0: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
e6e0: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
e6f0: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
e700: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
e710: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
e720: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
e730: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
e740: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
e750: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
e760: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
e770: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
e780: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
e790: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23    return &y;.}.#
e7a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48  endif..#define H
e7b0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
e7c0: 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28  (a) (winFile*)&(
e7d0: 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29  (char*)a)[-(int)
e7e0: 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65  offsetof(winFile
e7f0: 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ,h)]../*.** Acqu
e800: 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ire a lock on th
e810: 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74  e handle h.*/.st
e820: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d  atic void winceM
e830: 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44  utexAcquire(HAND
e840: 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20  LE h){.   DWORD 
e850: 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20  dwErr;.   do {. 
e860: 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61      dwErr = osWa
e870: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
e880: 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  t(h, INFINITE);.
e890: 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72     } while (dwEr
e8a0: 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54  r != WAIT_OBJECT
e8b0: 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57  _0 && dwErr != W
e8c0: 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a  AIT_ABANDONED);.
e8d0: 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  }./*.** Release 
e8e0: 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20  a lock acquired 
e8f0: 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  by winceMutexAcq
e900: 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e  uire().*/.#defin
e910: 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65  e winceMutexRele
e920: 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75  ase(h) ReleaseMu
e930: 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72  tex(h)../*.** Cr
e940: 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  eate the mutex a
e950: 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  nd shared memory
e960: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
e970: 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  g in the file.**
e980: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
e990: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
e9a0: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
e9b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
e9c0: 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a  ename, winFile *
e9d0: 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52  pFile){.  LPWSTR
e9e0: 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20   zTok;.  LPWSTR 
e9f0: 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c  zName;.  DWORD l
ea00: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c  astErrno;.  BOOL
ea10: 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45   bLogged = FALSE
ea20: 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d  ;.  BOOL bInit =
ea30: 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20   TRUE;..  zName 
ea40: 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  = winUtf8ToUnico
ea50: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
ea60: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
ea70: 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d  .    /* out of m
ea80: 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74  emory */.    ret
ea90: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
eaa0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
eab0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
eac0: 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20   local lockdata 
ead0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69  */.  memset(&pFi
eae0: 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69  le->local, 0, si
eaf0: 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
eb00: 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
eb10: 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
eb20: 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
eb30: 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
eb40: 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
eb50: 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
eb60: 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f  e. */.  zTok = o
eb70: 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d  sCharLowerW(zNam
eb80: 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f  e);.  for (;*zTo
eb90: 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69  k;zTok++){.    i
eba0: 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27  f (*zTok == '\\'
ebb0: 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20  ) *zTok = '_';. 
ebc0: 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f   }..  /* Create/
ebd0: 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d  open the named m
ebe0: 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  utex */.  pFile-
ebf0: 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61  >hMutex = osCrea
ec00: 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46  teMutexW(NULL, F
ec10: 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ALSE, zName);.  
ec20: 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
ec30: 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex){.    pFile->
ec40: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
ec50: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
ec60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ec70: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
ec80: 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
ec90: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c  LITE_IOERR, pFil
eca0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
ecd0: 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61  eLock1", zFilena
ece0: 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  me);.  }..  /* A
ecf0: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
ed00: 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
ed10: 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74  ng */.  winceMut
ed20: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
ed30: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f  >hMutex);.  .  /
ed40: 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65  * Since the name
ed50: 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78  s of named mutex
ed60: 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20  es, semaphores, 
ed70: 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74  file mappings et
ed80: 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65  c are .  ** case
ed90: 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65  -sensitive, take
eda0: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
edb0: 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e  at by uppercasin
edc0: 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65  g the mutex name
edd0: 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20  .  ** and using 
ede0: 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72  that as the shar
edf0: 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e  ed filemapping n
ee00: 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68  ame..  */.  osCh
ee10: 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b  arUpperW(zName);
ee20: 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  .  pFile->hShare
ee30: 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  d = osCreateFile
ee40: 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44  MappingW(INVALID
ee50: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e  _HANDLE_VALUE, N
ee60: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
ee90: 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
eea0: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
eeb0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
eee0: 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61  );  ..  /* Set a
eef0: 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
ef00: 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66  ates we're the f
ef10: 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74  irst to create t
ef20: 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20  he memory so it 
ef30: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
ef40: 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
ef50: 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  /.  lastErrno = 
ef60: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
ef70: 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e  ;.  if (lastErrn
ef80: 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  o == ERROR_ALREA
ef90: 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
efa0: 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
efb0: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
efc0: 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  ee(zName);..  /*
efd0: 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64   If we succeeded
efe0: 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73   in making the s
eff0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
f000: 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a  dle, map it. */.
f010: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
f020: 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c  ared ){.    pFil
f030: 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e  e->shared = (win
f040: 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65  ceLock*)osMapVie
f050: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  wOfFile(pFile->h
f060: 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20  Shared, .       
f070: 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52        FILE_MAP_R
f080: 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49  EAD|FILE_MAP_WRI
f090: 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66  TE, 0, 0, sizeof
f0a0: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
f0b0: 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20    /* If mapping 
f0c0: 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68  failed, close th
f0d0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
f0e0: 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65  handle and erase
f0f0: 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21   it */.    if( !
f100: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b  pFile->shared ){
f110: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
f120: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
f130: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
f140: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
f150: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c  LITE_IOERR, pFil
f160: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
f190: 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  2", zFilename);.
f1a0: 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20        bLogged = 
f1b0: 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c  TRUE;.      osCl
f1c0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
f1d0: 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  >hShared);.     
f1e0: 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
f1f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
f200: 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65  }..  /* If share
f210: 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e  d memory could n
f220: 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74  ot be created, t
f230: 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75  hen close the mu
f240: 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a  tex and fail */.
f250: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
f260: 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  ared==NULL ){.  
f270: 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29    if( !bLogged )
f280: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
f290: 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
f2a0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c  rrno;.      winL
f2b0: 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
f2c0: 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
f2d0: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
f2e0: 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
f2f0: 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46  CreateLock3", zF
f300: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
f310: 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a  bLogged = TRUE;.
f320: 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d      }.    winceM
f330: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
f340: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
f350: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
f360: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
f370: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
f380: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75  = NULL;.    retu
f390: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
f3a0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69  .  }.  .  /* Ini
f3b0: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72  tialize the shar
f3c0: 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27  ed memory if we'
f3d0: 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a  re supposed to *
f3e0: 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b  /.  if( bInit ){
f3f0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
f400: 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69  e->shared, 0, si
f410: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
f420: 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
f430: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
f440: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
f450: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f460: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
f470: 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
f480: 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
f490: 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
f4a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
f4b0: 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
f4c0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
f4d0: 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
f4e0: 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
f4f0: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
f500: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
f510: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
f520: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
f530: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
f540: 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
f550: 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
f560: 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
f570: 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
f580: 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
f590: 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
f5a0: 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
f5b0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
f5c0: 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
f5d0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
f5e0: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
f5f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
f600: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
f610: 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
f620: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
f630: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
f640: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
f650: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
f660: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
f670: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
f680: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
f690: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
f6a0: 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
f6b0: 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
f6c0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
f6d0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
f6e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
f6f0: 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
f700: 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
f710: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
f720: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73  handle */.    os
f730: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
f740: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
f750: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
f760: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
f770: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
f780: 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
f790: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
f7a0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
f7b0: 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20  Mutex);    .    
f7c0: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
f7d0: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
f7e0: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
f7f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = NULL;.  }.}../
f800: 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  * .** An impleme
f810: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c  ntation of the L
f820: 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66  ockFile() API of
f830: 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
f840: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
f850: 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20  inceLockFile(.  
f860: 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
f870: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
f880: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
f890: 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  D dwFileOffsetHi
f8a0: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  gh,.  DWORD nNum
f8b0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
f8c0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
f8d0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
f8e0: 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
f8f0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
f900: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
f910: 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
f920: 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
f930: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
f940: 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
f950: 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
f960: 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
f970: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
f980: 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
f990: 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
f9a0: 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
f9b0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
f9c0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
f9d0: 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63  * Wanting an exc
f9e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a  lusive lock? */.
f9f0: 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
fa00: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
fa10: 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20  SHARED_FIRST.   
fa20: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
fa30: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
fa40: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
fa50: 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70  SIZE){.    if (p
fa60: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
fa70: 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70  eaders == 0 && p
fa80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
fa90: 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
faa0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
fab0: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
fac0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
fad0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
fae0: 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
faf0: 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d         bReturn =
fb00: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
fb10: 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65  ..  /* Want a re
fb20: 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f  ad-only lock? */
fb30: 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
fb40: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
fb50: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
fb60: 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  ST &&.          
fb70: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
fb80: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
fb90: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
fba0: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
fbb0: 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70  e == 0){.      p
fbc0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
fbd0: 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69  ders ++;.      i
fbe0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
fbf0: 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a  nReaders == 1){.
fc00: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
fc10: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
fc20: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
fc30: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
fc40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fc50: 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67  * Want a pending
fc60: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
fc70: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
fc80: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
fc90: 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20  ENDING_BYTE.    
fca0: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
fcb0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
fcc0: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20  w == 1){.    /* 
fcd0: 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f  If no pending lo
fce0: 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71 75  ck has been acqu
fcf0: 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69  ired, then acqui
fd00: 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20  re it */.    if 
fd10: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
fd20: 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b  bPending == 0) {
fd30: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
fd40: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
fd50: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
fd60: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
fd70: 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ng = TRUE;.     
fd80: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
fd90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fda0: 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65 64   Want a reserved
fdb0: 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
fdc0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
fdd0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52  tLow == (DWORD)R
fde0: 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20  ESERVED_BYTE.   
fdf0: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
fe00: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
fe10: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
fe20: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
fe30: 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29  >bReserved == 0)
fe40: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
fe50: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
fe60: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
fe70: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
fe80: 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20  served = TRUE;. 
fe90: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
fea0: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
feb0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
fec0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
fed0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
fee0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
fef0: 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
ff00: 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69   of the UnlockFi
ff10: 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77  le API of Window
ff20: 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74  s for CE.*/.stat
ff30: 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c  ic BOOL winceUnl
ff40: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
ff50: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
ff60: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
ff70: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
ff80: 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
ff90: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
ffa0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
ffb0: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
ffc0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
ffd0: 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  High.){.  winFil
ffe0: 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c  e *pFile = HANDL
fff0: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46  E_TO_WINFILE(phF
10000 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65  ile);.  BOOL bRe
10010 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20  turn = FALSE;.. 
10020 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10030 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  R(dwFileOffsetHi
10040 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gh);.  UNUSED_PA
10050 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f  RAMETER(nNumberO
10060 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
10070 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
10080 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
10090 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
100a0 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
100b0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
100c0 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
100d0 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e  eader lock or an
100e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
100f0 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
10100 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
10110 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29  RD)SHARED_FIRST)
10120 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  {.    /* Did we 
10130 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
10140 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69  e lock? */.    i
10150 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
10160 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20  bExclusive){.   
10170 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65     assert(nNumbe
10180 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
10190 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
101a0 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20  ARED_SIZE);.    
101b0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
101c0 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
101d0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
101e0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
101f0 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
10200 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10210 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10220 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65  Did we just have
10230 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20   a reader lock? 
10240 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28  */.    else if (
10250 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
10260 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73  aders){.      as
10270 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
10280 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
10290 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
102a0 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20  SIZE.           
102b0 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79    || nNumberOfBy
102c0 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
102d0 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  = 1);.      pFil
102e0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
102f0 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28  s --;.      if (
10300 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
10310 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20  aders == 0).    
10320 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c    {.        pFil
10330 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
10340 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  ers --;.      }.
10350 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
10360 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
10370 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
10380 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a  a pending lock *
10390 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
103a0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
103b0 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
103c0 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
103d0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
103e0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
103f0 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
10400 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
10410 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10420 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
10430 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
10440 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
10450 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
10460 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
10470 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RUE;.    }.  }. 
10480 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
10490 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f  reserved lock */
104a0 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
104b0 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
104c0 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
104d0 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
104e0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
104f0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
10500 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
10510 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10520 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d) {.      pFile
10530 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
10540 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
10550 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10560 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
10570 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
10580 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10590 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
105a0 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
105b0 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
105c0 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a   bReturn;.}./*.*
105d0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65  * End of the spe
105e0 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69  cial code for wi
105f0 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nce.************
10600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10640 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  */.#endif /* SQL
10650 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a  ITE_OS_WINCE */.
10660 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69  ./*.** Lock a fi
10670 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74  le region..*/.st
10680 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63  atic BOOL winLoc
10690 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
106a0 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
106b0 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44  D flags,.  DWORD
106c0 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
106d0 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
106e0 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
106f0 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
10700 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66  BytesHigh.){.#if
10710 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10720 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
10730 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
10740 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
10750 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
10760 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
10770 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49  2.  **       API
10780 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a   LockFile..  */.
10790 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f    return winceLo
107a0 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
107b0 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
107c0 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
107e0 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
107f0 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20  esHigh);.#else. 
10800 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
10810 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
10820 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
10830 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
10840 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
10850 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
10860 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
10870 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
10880 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
10890 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
108a0 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
108b0 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74  flags, 0, numByt
108c0 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
108d0 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
108e0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
108f0 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46   osLockFile(*phF
10900 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
10910 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
10920 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
10940 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20  umBytesHigh);.  
10950 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
10960 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  * Unlock a file 
10970 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74  region.. */.stat
10980 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63  ic BOOL winUnloc
10990 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
109a0 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
109b0 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
109c0 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
109d0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
109e0 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
109f0 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
10a00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10a10 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
10a20 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
10a30 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
10a40 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
10a50 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
10a60 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
10a70 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20  I UnlockFile..  
10a80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
10a90 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69  eUnlockFile(phFi
10aa0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
10ab0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
10ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ad0 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
10ae0 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
10af0 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73  #else.  if( osIs
10b00 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
10b10 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
10b20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
10b30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
10b40 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
10b50 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
10b60 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
10b70 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
10b80 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
10b90 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28   osUnlockFileEx(
10ba0 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42  *phFile, 0, numB
10bb0 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
10bc0 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20  sHigh, &ovlp);. 
10bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
10be0 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28  rn osUnlockFile(
10bf0 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  *phFile, offsetL
10c00 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20  ow, offsetHigh, 
10c10 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20  numBytesLow,.   
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67       numBytesHig
10c40 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  h);.  }.#endif.}
10c50 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
10c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ca0 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f  .** The next gro
10cb0 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69  up of routines i
10cc0 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f  mplement the I/O
10cd0 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69   methods specifi
10ce0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c  ed.** by the sql
10cf0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
10d00 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  object..********
10d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d50 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ******/../*.** S
10d60 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
10d70 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
10d80 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
10d90 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
10da0 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
10db0 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c  R.# define INVAL
10dc0 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
10dd0 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a  TER ((DWORD)-1).
10de0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
10df0 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ve the current p
10e00 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  osition of the f
10e10 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65  ile handle passe
10e20 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
10e30 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  ** argument to o
10e40 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69  ffset iOffset wi
10e50 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  thin the file. I
10e60 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
10e70 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65  turn 0. .** Othe
10e80 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65  rwise, set pFile
10e90 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20  ->lastErrno and 
10ea0 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
10eb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10ec0 69 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69  inSeekFile(winFi
10ed0 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
10ee0 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74  e3_int64 iOffset
10ef0 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
10f00 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75  S_WINRT.  LONG u
10f10 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  pperBits;       
10f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73            /* Mos
10f30 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
10f40 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
10f50 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
10f60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f70 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20    /* Least sig. 
10f80 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
10f90 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44  ffset */.  DWORD
10fa0 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20   dwRet;         
10fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
10fc0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
10fd0 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
10fe0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
10ff0 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
11000 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
11010 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
11020 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20  stError() */..  
11030 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
11040 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
11050 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  lld\n", pFile->h
11060 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20  , iOffset));..  
11070 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  upperBits = (LON
11080 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29  G)((iOffset>>32)
11090 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
110a0 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c    lowerBits = (L
110b0 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30  ONG)(iOffset & 0
110c0 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f  xffffffff);..  /
110d0 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66  * API oddity: If
110e0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74   successful, Set
110f0 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65  FilePointer() re
11100 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20  turns a dword . 
11110 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
11120 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73  he lower 32-bits
11130 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
11140 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20  -offset. Or, if 
11150 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69  it fails,.  ** i
11160 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49  t returns INVALI
11170 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
11180 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f  ER. However acco
11190 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a  rding to MSDN, .
111a0 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54    ** INVALID_SET
111b0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61  _FILE_POINTER ma
111c0 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69  y also be a vali
111d0 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f  d new offset. So
111e0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
111f0 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65   ** whether an e
11200 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c  rror has actuall
11210 79 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69  y occurred, it i
11220 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
11230 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
11240 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
11250 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
11260 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
11270 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
11280 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
11290 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
112a0 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
112b0 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
112c0 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
112d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
112e0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
112f0 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
11300 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11310 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
11320 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
11330 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
11340 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
11350 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11360 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65      "winSeekFile
11370 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
11380 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
11390 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
113a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  =SQLITE_IOERR_SE
113b0 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  EK\n", pFile->h)
113c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
113d0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
113e0 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
113f0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
11400 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
11410 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20  eturn 0;.#else. 
11420 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73   /*.  ** Same as
11430 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74   above, except t
11440 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65  hat this impleme
11450 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f  ntation works fo
11460 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20  r WinRT..  */.. 
11470 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78   LARGE_INTEGER x
11480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11490 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73   /* The new offs
114a0 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  et */.  BOOL bRe
114b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
114c0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
114d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74   returned by Set
114e0 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20  FilePointerEx() 
114f0 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74  */..  x.QuadPart
11500 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52   = iOffset;.  bR
11510 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
11520 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68  interEx(pFile->h
11530 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47  , x, 0, FILE_BEG
11540 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74  IN);..  if(!bRet
11550 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
11560 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
11570 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
11580 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
11590 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70  TE_IOERR_SEEK, p
115a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
115b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
115c0 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20   "winSeekFile", 
115d0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
115e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45     OSTRACE(("SEE
115f0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
11600 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c  LITE_IOERR_SEEK\
11610 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
11620 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
11630 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
11640 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
11650 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
11660 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
11670 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
11680 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
11690 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f  MAP_SIZE>0./* Fo
116a0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
116b0 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d   to VFS helper m
116c0 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20  ethods used for 
116d0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69  memory mapped fi
116e0 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  les */.static in
116f0 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
11700 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69  File*, sqlite3_i
11710 6e 74 36 34 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt64);.static in
11720 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77  t winUnmapfile(w
11730 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66  inFile*);.#endif
11740 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
11750 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  file..**.** It i
11760 73 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20  s reported that 
11770 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c  an attempt to cl
11780 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67  ose a handle mig
11790 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ht sometimes.** 
117a0 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61  fail.  This is a
117b0 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62   very unreasonab
117c0 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57  le result, but W
117d0 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69  indows is notori
117e0 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67  ous.** for being
117f0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f   unreasonable so
11800 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20   I do not doubt 
11810 74 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61  that it might ha
11820 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65  ppen.  If.** the
11830 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65   close fails, we
11840 20 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d   pause for 100 m
11850 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
11860 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a  try again.  As.*
11870 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f  * many as MX_CLO
11880 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d  SE_ATTEMPT attem
11890 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  pts to close the
118a0 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65   handle are made
118b0 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e   before.** givin
118c0 67 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  g up and returni
118d0 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
118e0 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45  #define MX_CLOSE
118f0 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69  _ATTEMPT 3.stati
11900 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73  c int winClose(s
11910 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
11920 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20  {.  int rc, cnt 
11930 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  = 0;.  winFile *
11940 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
11950 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
11960 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65   id!=0 );.#ifnde
11970 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
11980 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  L.  assert( pFil
11990 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65  e->pShm==0 );.#e
119a0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
119b0 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26  File->h!=NULL &&
119c0 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c   pFile->h!=INVAL
119d0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
119e0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  );.  OSTRACE(("C
119f0 4c 4f 53 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c  LOSE file=%p\n",
11a00 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69   pFile->h));..#i
11a10 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
11a20 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e  P_SIZE>0.  winUn
11a30 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
11a40 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20  #endif..  do{.  
11a50 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61    rc = osCloseHa
11a60 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  ndle(pFile->h);.
11a70 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49      /* SimulateI
11a80 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e  OError( rc=0; cn
11a90 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  t=MX_CLOSE_ATTEM
11aa0 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69  PT; ); */.  }whi
11ab0 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63  le( rc==0 && ++c
11ac0 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  nt < MX_CLOSE_AT
11ad0 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65  TEMPT && (sqlite
11ae0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
11af0 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51  0), 1) );.#if SQ
11b00 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64  LITE_OS_WINCE.#d
11b10 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45  efine WINCE_DELE
11b20 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a  TION_ATTEMPTS 3.
11b30 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f    winceDestroyLo
11b40 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ck(pFile);.  if(
11b50 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
11b60 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e  nClose ){.    in
11b70 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77  t cnt = 0;.    w
11b80 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  hile(.          
11b90 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70   osDeleteFileW(p
11ba0 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
11bb0 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20  lose)==0.       
11bc0 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74   && osGetFileAtt
11bd0 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e  ributesW(pFile->
11be0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21  zDeleteOnClose)!
11bf0 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20  =0xffffffff .   
11c00 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20       && cnt++ < 
11c10 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
11c20 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20  TTEMPTS.    ){. 
11c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69        sqlite3_wi
11c40 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20  n32_sleep(100); 
11c50 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c   /* Wait a littl
11c60 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  e before trying 
11c70 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  again */.    }. 
11c80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11c90 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
11ca0 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  Close);.  }.#end
11cb0 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  if.  if( rc ){. 
11cc0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55     pFile->h = NU
11cd0 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f  LL;.  }.  OpenCo
11ce0 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54  unter(-1);.  OST
11cf0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c  RACE(("CLOSE fil
11d00 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
11d10 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
11d20 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
11d30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
11d40 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
11d50 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72        : winLogEr
11d60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
11d70 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73  _CLOSE, osGetLas
11d80 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20      "winClose", 
11db0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d  pFile->zPath);.}
11dc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
11dd0 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
11de0 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
11df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
11e00 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
11e10 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
11e20 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
11e30 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
11e40 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
11e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11e60 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74  winRead(.  sqlit
11e70 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
11e80 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
11e90 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
11ea0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
11eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
11ec0 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ite content into
11ed0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
11ee0 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
11f10 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c  to read */.  sql
11f20 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
11f30 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  t       /* Begin
11f40 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73   reading at this
11f50 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69   offset */.){.#i
11f60 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
11f70 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20  CE.  OVERLAPPED 
11f80 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20  overlapped;     
11f90 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
11fa0 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e  et for ReadFile.
11fb0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   */.#endif.  win
11fc0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
11fd0 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
11fe0 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  file handle */. 
11ff0 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20   DWORD nRead;   
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12020 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
12030 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20  d from file */. 
12040 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
12070 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  trys */..  asser
12080 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
12090 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
120a0 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
120b0 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
120c0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
120d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
120e0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  );.  OSTRACE(("R
120f0 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66  EAD file=%p, buf
12100 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25  fer=%p, amount=%
12110 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  d, offset=%lld, 
12120 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
12130 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
12140 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
12150 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
12160 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
12170 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12180 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
12190 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
121a0 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
121b0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
121c0 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
121d0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
121e0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
121f0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
12200 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
12210 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
12220 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
12230 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
12240 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
12250 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
12260 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
12270 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
12280 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
12290 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41  TRACE(("READ-MMA
122a0 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  P file=%p, rc=SQ
122b0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
122c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
122d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
122e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
122f0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
12300 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
12310 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
12320 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
12330 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
12340 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
12350 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
12360 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
12370 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
12380 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
12390 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
123a0 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
123b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
123c0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
123d0 43 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b  CE.  if( winSeek
123e0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
123f0 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  et) ){.    OSTRA
12400 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
12410 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
12420 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  L\n", pFile->h))
12430 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12440 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20  ITE_FULL;.  }.  
12450 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
12460 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
12470 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
12480 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65  0) ){.#else.  me
12490 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
124a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
124b0 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72  LAPPED));.  over
124c0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20  lapped.Offset = 
124d0 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20  (LONG)(offset & 
124e0 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f  0xffffffff);.  o
124f0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
12500 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
12510 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
12520 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c  fffffff);.  whil
12530 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
12540 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
12550 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65  mt, &nRead, &ove
12560 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20  rlapped) &&.    
12570 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
12580 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e  ror()!=ERROR_HAN
12590 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69  DLE_EOF ){.#endi
125a0 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  f.    DWORD last
125b0 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77  Errno;.    if( w
125c0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52  inRetryIoerr(&nR
125d0 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
125e0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
125f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12600 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
12610 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
12620 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  AD file=%p, rc=S
12630 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
12640 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12650 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
12660 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12670 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65  OERR_READ, pFile
12680 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126a0 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70      "winRead", p
126b0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
126c0 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  }.  winLogIoerr(
126d0 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e  nRetry);.  if( n
126e0 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20  Read<(DWORD)amt 
126f0 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  ){.    /* Unread
12700 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
12710 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
12720 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
12730 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
12740 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c  pBuf)[nRead], 0,
12750 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20   amt-nRead);.   
12760 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
12770 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12780 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
12790 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  EAD\n", pFile->h
127a0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
127b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
127c0 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f  T_READ;.  }..  O
127d0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
127e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
127f0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
12800 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
12810 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12820 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
12830 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
12840 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
12850 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
12860 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
12870 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
12880 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
12890 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
128a0 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
128b0 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
128c0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
128d0 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
128e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
128f0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
12900 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
12910 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
12920 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
12930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12940 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12950 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
12960 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
12970 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
12980 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
12990 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
129a0 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
129b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
129c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
129d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
129e0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
129f0 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
12a00 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
12a10 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
12a20 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
12a30 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  dle */.  int nRe
12a40 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
12a50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12a60 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f  er of retries */
12a70 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ..  assert( amt>
12a80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12a90 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
12aa0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
12ab0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
12ac0 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
12ad0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
12ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
12af0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
12b00 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62  WRITE file=%p, b
12b10 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
12b20 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%d, offset=%lld
12b30 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
12b40 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
12b50 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
12b60 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
12b70 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
12b80 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
12b90 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
12ba0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
12bb0 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
12bc0 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
12bd0 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
12be0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
12bf0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
12c00 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
12c10 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
12c20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
12c30 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
12c40 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
12c50 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
12c60 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
12c70 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
12c80 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
12c90 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
12ca0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
12cb0 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
12cc0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
12cd0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12cf0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
12d00 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
12d10 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
12d20 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
12d30 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
12d40 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
12d50 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
12d60 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79  et], pBuf, nCopy
12d70 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
12d80 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
12d90 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
12da0 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
12db0 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
12dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
12dd0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
12de0 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 77 69  _WINCE.  rc = wi
12df0 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
12e00 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
12e10 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20  rc==0 ){.#else. 
12e20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53   {.#endif.#if !S
12e30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
12e40 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
12e50 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
12e60 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
12e70 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f  or WriteFile. */
12e80 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a  .#endif.    u8 *
12e90 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75  aRem = (u8 *)pBu
12ea0 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  f;        /* Dat
12eb0 61 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  a yet to be writ
12ec0 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ten */.    int n
12ed0 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20  Rem = amt;      
12ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12ef0 65 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20  er of bytes yet 
12f00 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
12f10 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74  .    DWORD nWrit
12f20 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
12f30 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74     /* Bytes writ
12f40 74 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74  ten by each Writ
12f50 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a  eFile() call */.
12f60 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72      DWORD lastEr
12f70 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20  rno = NO_ERROR; 
12f80 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
12f90 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
12fa0 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53  ror() */..#if !S
12fb0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
12fc0 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c     memset(&overl
12fd0 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
12fe0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
12ff0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
13000 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
13010 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
13020 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  f);.    overlapp
13030 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
13040 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
13050 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
13060 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77  );.#endif..    w
13070 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
13080 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13090 4e 43 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f  NCE.      if( !o
130a0 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
130b0 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
130c0 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a   &nWrite, 0) ){.
130d0 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  #else.      if( 
130e0 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69  !osWriteFile(pFi
130f0 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65  le->h, aRem, nRe
13100 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65  m, &nWrite, &ove
13110 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64  rlapped) ){.#end
13120 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  if.        if( w
13130 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52  inRetryIoerr(&nR
13140 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
13150 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
13160 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13170 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
13180 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  t( nWrite==0 || 
13190 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e  nWrite<=(DWORD)n
131a0 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rem );.      if(
131b0 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
131c0 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
131d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
131e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
131f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
13200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
13210 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
13220 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73  WINCE.      offs
13230 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  et += nWrite;.  
13240 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
13250 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
13260 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
13270 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ff);.      overl
13280 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
13290 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
132a0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
132b0 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  fff);.#endif.   
132c0 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
132d0 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
132e0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
132f0 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
13300 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
13310 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
13320 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
13330 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
13340 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
13350 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
13360 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
13370 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
13380 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
13390 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
133a0 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
133b0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
133c0 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
133d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
133e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
133f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
13400 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
13410 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61  _FULL, pFile->la
13420 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70    "winWrite1", p
13450 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13460 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28    }.    OSTRACE(
13470 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
13480 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
13490 5f 57 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65  _WRITE\n", pFile
134a0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
134b0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
134c0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
134d0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
134e0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
134f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
13500 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite2", pFile->z
13510 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
13520 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
13530 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f  nRetry);.  }.  O
13540 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
13550 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13560 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13570 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
13580 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13590 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
135a0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
135b0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
135c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
135d0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
135e0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
135f0 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
13600 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
13610 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
13620 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
13630 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
13640 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
13650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13660 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
13670 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
13680 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13690 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
136a0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
136b0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
136c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
136d0 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  CATE);.  OSTRACE
136e0 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65  (("TRUNCATE file
136f0 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20  =%p, size=%lld, 
13700 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
13710 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
13720 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c   nByte, pFile->l
13730 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
13740 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
13750 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
13760 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
13770 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
13780 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
13790 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
137a0 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
137b0 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
137c0 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
137d0 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
137e0 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
137f0 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
13800 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
13810 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
13820 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
13830 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
13840 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
13850 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
13860 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
13870 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
13880 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
13890 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  }..  /* SetEndOf
138a0 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e  File() returns n
138b0 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63  on-zero when suc
138c0 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f  cessful, or zero
138d0 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20   when it fails. 
138e0 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b  */.  if( winSeek
138f0 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  File(pFile, nByt
13900 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  e) ){.    rc = w
13910 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
13920 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
13930 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13940 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13950 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
13960 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  ncate1", pFile->
13970 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20  zPath);.  }else 
13980 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f  if( 0==osSetEndO
13990 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
139a0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  &&.            (
139b0 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
139c0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
139d0 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45  ERROR_USER_MAPPE
139e0 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70  D_FILE) ){.    p
139f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13a00 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
13a10 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
13a20 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
13a30 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
13a40 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20  "winTruncate2", 
13a70 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
13a80 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   }..#if SQLITE_M
13a90 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
13aa0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
13ab0 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f  was truncated to
13ac0 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20   a size smaller 
13ad0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
13ae0 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  ly.  ** mapped r
13af0 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
13b00 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
13b10 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
13b20 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
13b30 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e  ** use read() an
13b40 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63  d write() to acc
13b50 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20  ess data beyond 
13b60 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20  this point from 
13b70 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  now on..  */.  i
13b80 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  f( pFile->pMapRe
13b90 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46  gion && nByte<pF
13ba0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
13bb0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
13bc0 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
13bd0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
13be0 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66  ACE(("TRUNCATE f
13bf0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
13c00 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
13c10 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
13c20 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13c30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13c40 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
13c50 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
13c60 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
13c70 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
13c80 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
13c90 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
13ca0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
13cb0 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
13cc0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
13cd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
13ce0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
13cf0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
13d00 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
13d10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
13d20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
13d30 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
13d40 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
13d50 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
13d60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
13d70 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
13d80 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
13d90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
13da0 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
13db0 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
13dc0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
13dd0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
13de0 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
13df0 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
13e00 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
13e10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
13e20 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
13e30 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
13e40 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
13e50 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
13e60 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
13e70 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
13e80 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
13e90 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
13ea0 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
13eb0 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
13ec0 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
13ed0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
13ee0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
13ef0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
13f00 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
13f10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
13f20 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
13f30 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
13f40 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
13f50 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
13f60 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
13f70 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
13f80 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
13f90 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
13fa0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
13fb0 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
13fc0 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
13fd0 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
13fe0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
13ff0 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
14000 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
14010 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
14020 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
14030 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
14040 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
14050 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
14060 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
14070 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53  TE_FULL );..  OS
14080 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
14090 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%p, flags=%x, 
140a0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
140b0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
140c0 20 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c   flags, pFile->l
140d0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e  ocktype));..#ifn
140e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
140f0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
14100 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
14110 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
14120 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
14130 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
14140 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
14150 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
14160 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
14170 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
14180 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
14190 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
141a0 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
141b0 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
141c0 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
141d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
141e0 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28  SYNC.  OSTRACE((
141f0 22 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25  "SYNC-NOP file=%
14200 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
14210 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
14220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14230 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  OK;.#else.  rc =
14240 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
14250 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
14260 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14270 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
14280 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53  if( rc ){.    OS
14290 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
142a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
142b0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
142c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
142d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
142e0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
142f0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
14300 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f  stError();.    O
14310 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69  STRACE(("SYNC fi
14320 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
14330 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c  _IOERR_FSYNC\n",
14340 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14350 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14360 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14370 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
14380 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
14390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143a0 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
143b0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
143c0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
143d0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
143e0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
143f0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
14400 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
14410 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
14420 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
14430 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
14440 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14450 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14460 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14470 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
14480 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
14490 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b  ert( pSize!=0 );
144a0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
144b0 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
144c0 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
144d0 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
144e0 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
144f0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
14500 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51  pSize));..#if SQ
14510 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
14520 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44  {.    FILE_STAND
14530 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20  ARD_INFO info;. 
14540 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65     if( osGetFile
14550 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
14560 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  dleEx(pFile->h, 
14570 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f  FileStandardInfo
14580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145a0 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69         &info, si
145b0 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20  zeof(info)) ){. 
145c0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e       *pSize = in
145d0 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61  fo.EndOfFile.Qua
145e0 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  dPart;.    }else
145f0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
14600 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
14610 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
14620 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
14630 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14640 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
14650 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
14680 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14690 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
146a0 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70   {.    DWORD upp
146b0 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
146c0 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  D lowerBits;.   
146d0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
146e0 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73  ;..    lowerBits
146f0 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65   = osGetFileSize
14700 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65  (pFile->h, &uppe
14710 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69  rBits);.    *pSi
14720 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
14730 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
14740 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
14750 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f  s;.    if(   (lo
14760 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c  werBits == INVAL
14770 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20  ID_FILE_SIZE).  
14780 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
14790 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
147a0 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
147b0 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  R) ){.      pFil
147c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
147d0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
147e0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
147f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
14800 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
14810 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14830 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
14840 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
14850 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  }.  }.#endif.  O
14860 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
14870 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c  le=%p, pSize=%p,
14880 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63   *pSize=%lld, rc
14890 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
148a0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69     pFile->h, pSi
148b0 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69  ze, *pSize, sqli
148c0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
148d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
148e0 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
148f0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
14900 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
14910 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
14920 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
14930 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
14940 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
14950 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
14960 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
14970 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  1.#endif..#ifnde
14980 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  f LOCKFILE_EXCLU
14990 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  SIVE_LOCK.# defi
149a0 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ne LOCKFILE_EXCL
149b0 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e  USIVE_LOCK 2.#en
149c0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f  dif../*.** Histo
149d0 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20  rically, SQLite 
149e0 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68  has used both th
149f0 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c  e LockFile and L
14a00 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
14a10 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ons..** When the
14a20 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69   LockFile functi
14a30 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20  on was used, it 
14a40 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63  was always expec
14a50 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69  ted to fail.** i
14a60 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
14a70 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  e lock could not
14a80 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41   be obtained.  A
14a90 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65  lso, it always e
14aa0 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62  xpected to.** ob
14ab0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
14ac0 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66  e lock.  These f
14ad0 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69  lags are used wi
14ae0 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  th the LockFileE
14af0 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e  x function.** an
14b00 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20  d reflect those 
14b10 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68  expectations; th
14b20 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68  erefore, they sh
14b30 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e  ould not be chan
14b40 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ged..*/.#ifndef 
14b50 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
14b60 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
14b70 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
14b80 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45  LAGS   (LOCKFILE
14b90 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
14ba0 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  Y | \.          
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bc0 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45          LOCKFILE
14bd0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  _EXCLUSIVE_LOCK)
14be0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
14bf0 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65  urrently, SQLite
14c00 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65   never calls the
14c10 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
14c20 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e  tion without wan
14c30 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ting the.** call
14c40 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61   to fail immedia
14c50 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
14c60 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
14c70 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
14c80 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
14c90 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  X_FLAGS.# define
14ca0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
14cb0 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49  EX_FLAGS (LOCKFI
14cc0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
14cd0 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ELY).#endif../*.
14ce0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
14cf0 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
14d00 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
14d10 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
14d20 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
14d30 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
14d40 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57  ** is Win9x or W
14d50 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
14d60 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  int winGetReadLo
14d70 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
14d80 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
14d90 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
14da0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
14db0 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
14dc0 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
14dd0 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
14de0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
14df0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
14e00 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
14e10 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
14e20 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
14e30 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
14e40 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
14e50 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  2.    **       A
14e60 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20  PI LockFileEx.. 
14e70 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20     */.    res = 
14e80 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70  winceLockFile(&p
14e90 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
14ea0 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
14eb0 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d  .#else.    res =
14ec0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
14ed0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
14ee0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
14ef0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
14f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14f10 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
14f20 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  IZE, 0);.#endif.
14f30 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
14f40 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
14f50 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
14f60 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
14f70 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
14f80 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
14f90 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
14fa0 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
14fb0 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
14fc0 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
14fd0 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
14fe0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
14ff0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
15000 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
15030 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
15040 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
15050 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
15060 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
15070 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
15080 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15090 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
150a0 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
150b0 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
150c0 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41  k */.  }.  OSTRA
150d0 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66  CE(("READ-LOCK f
150e0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
150f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
15100 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29  te3ErrName(res))
15110 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
15120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61  .}../*.** Undo a
15130 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61   readlock.*/.sta
15140 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
15150 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  kReadLock(winFil
15160 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
15170 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61   res;.  DWORD la
15180 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41  stErrno;.  OSTRA
15190 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b  CE(("READ-UNLOCK
151a0 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
151b0 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
151c0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
151d0 29 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  );.  if( osIsNT(
151e0 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77  ) ){.    res = w
151f0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
15200 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
15210 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
15220 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69  SIZE, 0);.  }.#i
15230 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
15240 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
15250 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  e{.    res = win
15260 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15270 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
15280 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
15290 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
152a0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
152b0 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
152c0 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
152d0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
152e0 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44  ERROR_NOT_LOCKED
152f0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
15300 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
15310 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
15320 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
15330 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c  ERR_UNLOCK, pFil
15340 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
15360 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
15370 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
15380 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
15390 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69  ("READ-UNLOCK fi
153a0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
153b0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
153c0 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
153d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
153e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
153f0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
15400 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
15410 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
15420 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
15430 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
15440 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
15450 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
15460 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
15470 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
15480 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
15490 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
154a0 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
154b0 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
154c0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
154d0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
154e0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
154f0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
15500 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
15510 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
15520 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
15530 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
15540 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
15550 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
15560 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
15570 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
15580 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
15590 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
155a0 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
155b0 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
155c0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
155d0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
155e0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
155f0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
15600 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
15610 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
15620 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
15630 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
15640 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
15650 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
15660 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
15670 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
15680 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
15690 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
156a0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
156b0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
156c0 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
156d0 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
156e0 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
156f0 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
15700 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
15710 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
15720 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
15730 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
15740 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
15750 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
15760 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
15770 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
15780 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
15790 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
157a0 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
157b0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
157c0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
157d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
157e0 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
157f0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
15800 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
15810 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
15820 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
15830 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
15840 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
15850 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
15860 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
15870 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
15880 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
15890 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
158a0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
158b0 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
158c0 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
158d0 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
158e0 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
158f0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
15900 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
15910 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
15920 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
15930 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
15940 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
15950 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
15960 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
15970 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
15980 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
15990 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
159a0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
159b0 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
159c0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
159d0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
159e0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
159f0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
15a00 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
15a10 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
15a20 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
15a30 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
15a40 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
15a50 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
15a60 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
15a70 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
15a80 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
15a90 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
15aa0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
15ab0 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  HELD file=%p, rc
15ac0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
15ad0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
15ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15af0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
15b00 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
15b10 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
15b20 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
15b30 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
15b40 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
15b50 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
15b60 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
15b70 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
15b80 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
15b90 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
15ba0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
15bb0 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
15bc0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
15bd0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
15be0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
15bf0 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
15c00 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
15c10 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
15c20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
15c30 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
15c40 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
15c50 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
15c60 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
15c70 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
15c80 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
15c90 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
15ca0 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
15cb0 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
15cc0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
15cd0 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
15ce0 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
15cf0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
15d00 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
15d10 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
15d20 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
15d30 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
15d40 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
15d50 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
15d60 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
15d70 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
15d80 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42         PENDING_B
15dc0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
15dd0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
15de0 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
15df0 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
15e00 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  k.  This is need
15e10 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20  ed to work.     
15e20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c   ** around probl
15e30 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e  ems caused by in
15e40 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e  dexing and/or an
15e50 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72  ti-virus softwar
15e60 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69  e on.      ** Wi
15e70 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20  ndows systems.. 
15e80 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61       ** If you a
15e90 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f  re using this co
15ea0 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f  de as a model fo
15eb0 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46  r alternative VF
15ec0 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20  Ses, do not.    
15ed0 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72    ** copy this r
15ee0 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20  etry logic.  It 
15ef0 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64  is a hack intend
15f00 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f  ed for Windows o
15f10 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nly..      */.  
15f20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
15f30 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20  CK-PENDING-FAIL 
15f40 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
15f50 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
15f60 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
15f70 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74  e->h, cnt, sqlit
15f80 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
15f90 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  ;.      if( cnt 
15fa0 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
15fb0 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
15fc0 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
15fd0 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
15fe0 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
15ff0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16000 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16010 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
16020 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
16030 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
16040 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16050 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
16060 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
16070 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
16080 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
16090 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
160a0 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
160b0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
160c0 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
160d0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
160e0 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
160f0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
16100 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
16110 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
16120 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
16130 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16140 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
16150 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
16160 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
16170 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16180 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
16190 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
161a0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
161b0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
161c0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
161d0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
161e0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
161f0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45  wLocktype = RESE
16200 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RVED_LOCK;.    }
16210 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
16220 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
16230 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
16240 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
16250 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
16260 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
16270 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
16280 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
16290 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
162a0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
162b0 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
162c0 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
162d0 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
162e0 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
162f0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
16300 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
16310 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
16320 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
16330 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
16340 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
16350 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
16360 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73  (pFile);.    res
16370 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
16380 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
16390 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
163a0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
163b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
163c0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
163d0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
163e0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
163f0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
16400 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
16410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
16420 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16430 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
16440 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
16450 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
16460 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
16470 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
16480 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
16490 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
164a0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
164b0 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
164c0 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
164d0 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
164e0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
164f0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
16500 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
16510 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
16520 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
16530 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
16540 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
16550 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
16560 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16570 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
16580 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
16590 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
165a0 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
165b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
165c0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
165d0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
165e0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
165f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16600 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  USY;.    OSTRACE
16610 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
16620 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c  e=%p, wanted=%d,
16630 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   got=%d\n",.    
16640 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16650 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77  h, locktype, new
16660 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a  Locktype));.  }.
16670 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
16680 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
16690 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
166a0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  "LOCK file=%p, l
166b0 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
166c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
166d0 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
166e0 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
166f0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
16700 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16710 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16720 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
16730 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
16740 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
16750 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
16760 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
16770 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
16780 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
16790 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
167a0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
167b0 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
167c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
167d0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
167e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
167f0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
16800 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46    int rc;.  winF
16810 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
16820 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  nFile*)id;..  Si
16830 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
16840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16850 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
16860 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41  LOCK; );.  OSTRA
16870 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
16880 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f  K file=%p, pResO
16890 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ut=%p\n", pFile-
168a0 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a  >h, pResOut));..
168b0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
168c0 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
168d0 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
168e0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
168f0 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
16900 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43  CE(("TEST-WR-LOC
16910 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64  K file=%p, rc=%d
16920 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
16930 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d  le->h, rc));.  }
16940 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77  else{.    rc = w
16950 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
16960 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
16970 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45  KFILEEX_FLAGS,RE
16980 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
16990 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
169a0 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e  c ){.      winUn
169b0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
169c0 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
169d0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
169e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b   }.    rc = !rc;
169f0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
16a00 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
16a10 3d 25 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f  =%p, rc=%d (remo
16a20 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
16a30 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  , rc));.  }.  *p
16a40 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f  ResOut = rc;.  O
16a50 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
16a60 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
16a70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
16a80 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
16a90 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
16aa0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52      pFile->h, pR
16ab0 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
16ac0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16ad0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16ae0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
16af0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
16b00 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f  descriptor id to
16b10 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
16b20 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
16b30 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
16b40 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
16b50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
16b60 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
16b70 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16b80 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
16b90 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
16ba0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
16bb0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
16bc0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
16bd0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
16be0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
16bf0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61  is routine to fa
16c00 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  il if the second
16c10 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
16c20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65  NO_LOCK.  If the
16c30 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
16c40 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   is SHARED_LOCK 
16c50 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
16c60 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  e.** might retur
16c70 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
16c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
16c90 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nUnlock(sqlite3_
16ca0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
16cb0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
16cc0 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ype;.  winFile *
16cd0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
16ce0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
16cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
16d00 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
16d10 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
16d20 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
16d30 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  K );.  OSTRACE((
16d40 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
16d50 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
16d60 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
16d70 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16d80 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
16d90 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
16da0 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
16db0 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20  ktype));.  type 
16dc0 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
16dd0 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
16de0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
16df0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
16e00 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
16e10 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
16e20 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
16e30 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
16e40 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
16e50 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b   !winGetReadLock
16e60 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
16e70 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
16e80 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
16e90 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
16ea0 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
16eb0 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
16ec0 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
16ed0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
16ee0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16ef0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
16f00 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c      "winUnlock",
16f30 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16f40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
16f50 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
16f60 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
16f70 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
16f80 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
16f90 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
16fa0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
16fb0 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
16fc0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
16fd0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  .    winUnlockRe
16fe0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
16ff0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
17000 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
17010 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
17020 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
17030 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
17040 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
17050 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
17060 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
17070 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
17080 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
17090 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
170a0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
170b0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
170c0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
170d0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
170e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70  ;.}../*.** If *p
170f0 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c  Arg is inititial
17100 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
17110 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
17120 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
17130 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
17140 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
17150 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
17160 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
17170 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
17180 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
17190 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
171a0 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
171b0 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
171c0 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
171d0 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42  ic void winModeB
171e0 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  it(winFile *pFil
171f0 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
17200 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67   mask, int *pArg
17210 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30  ){.  if( *pArg<0
17220 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20   ){.    *pArg = 
17230 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
17240 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  s & mask)!=0;.  
17250 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67  }else if( (*pArg
17260 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  )==0 ){.    pFil
17270 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
17280 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ~mask;.  }else{.
17290 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
172a0 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  lags |= mask;.  
172b0 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
172c0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46  references to VF
172d0 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73  S helper methods
172e0 20 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72   used for tempor
172f0 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61  ary files */.sta
17300 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65  tic int winGetTe
17310 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76  mpname(sqlite3_v
17320 66 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a  fs *, char **);.
17330 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73  static int winIs
17340 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  Dir(const void *
17350 29 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  );.static BOOL w
17360 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
17370 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68  ndColon(const ch
17380 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ar *);../*.** Co
17390 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
173a0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
173b0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
173c0 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
173d0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
173e0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
173f0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77  void *pArg){.  w
17400 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
17410 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
17420 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
17430 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20  file=%p, op=%d, 
17440 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  pArg=%p\n", pFil
17450 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29  e->h, op, pArg))
17460 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
17470 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
17480 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
17490 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
174a0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
174b0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
174c0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
174d0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
174e0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
174f0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
17500 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
17510 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
17520 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
17530 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
17540 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65  Arg = (int)pFile
17550 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
17560 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17570 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
17580 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
17590 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
175a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
175b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
175c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
175d0 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
175e0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
175f0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
17600 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
17610 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17620 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
17630 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
17640 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17650 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
17660 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
17670 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
17680 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
17690 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20  Chunk>0 ){.     
176a0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
176b0 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20   oldSz;.        
176c0 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65  int rc = winFile
176d0 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29  Size(id, &oldSz)
176e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
176f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17700 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17710 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a  _int64 newSz = *
17720 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
17730 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20  pArg;.          
17740 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20  if( newSz>oldSz 
17750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
17760 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
17770 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
17780 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
17790 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29  ncate(id, newSz)
177a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ;.            Si
177b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
177c0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20  ign(0);.        
177d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
177e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
177f0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
17800 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
17810 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
17820 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
17830 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17840 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
17850 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
17860 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
17870 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
17880 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17890 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
178a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
178b0 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
178c0 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
178d0 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
178e0 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
178f0 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
17900 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
17910 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
17920 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
17930 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
17940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17950 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
17960 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
17970 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
17980 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
17990 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
179a0 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
179b0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
179c0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
179d0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
179e0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
179f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
17a10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17a20 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
17a30 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
17a40 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
17a50 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29  mprintf("win32")
17a60 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
17a70 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
17a80 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17a90 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17ab0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
17ac0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
17ad0 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
17ae0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
17af0 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
17b00 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
17b10 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f  ){.        winIo
17b20 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b  errRetry = a[0];
17b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17b40 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e        a[0] = win
17b50 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20  IoerrRetry;.    
17b60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b    }.      if( a[
17b70 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1]>0 ){.        
17b80 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
17b90 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  ay = a[1];.     
17ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17bb0 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52  a[1] = winIoerrR
17bc0 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20  etryDelay;.     
17bd0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
17be0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
17bf0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
17c00 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
17c10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17c20 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
17c30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
17c40 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
17c50 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
17c60 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  TFile = 0;.     
17c70 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74   int rc = winGet
17c80 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
17c90 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a  pVfs, &zTFile);.
17ca0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17cb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17cc0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
17cd0 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
17ce0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
17cf0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
17d00 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
17d10 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
17d20 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
17d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17d40 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
17d50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
17d60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
17d70 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
17d80 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
17d90 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
17da0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
17db0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
17dc0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
17dd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17de0 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
17df0 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
17e00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
17e10 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
17e20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34     }.      *(i64
17e30 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
17e40 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
17e50 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
17e60 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
17e70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
17e80 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
17e90 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
17ea0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
17eb0 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
17ec0 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
17ed0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
17ee0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
17ef0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
17f00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
17f10 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
17f20 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
17f30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17f40 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
17f50 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
17f60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
17f70 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17f80 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
17f90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
17fa0 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  if.  }.  OSTRACE
17fb0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
17fc0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46  , rc=SQLITE_NOTF
17fd0 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  OUND\n", pFile->
17fe0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
17ff0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
18000 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18010 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
18020 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
18030 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
18040 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
18050 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
18060 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
18070 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
18080 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
18090 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
180a0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
180b0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
180c0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
180d0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
180e0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
180f0 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
18100 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
18110 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
18120 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
18130 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
18140 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
18150 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
18160 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
18170 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
18180 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
18190 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
181a0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
181b0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
181c0 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75  (void)id;.  retu
181d0 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
181e0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
181f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
18200 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
18210 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
18220 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
18230 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
18240 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
18250 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77  3_file *id){.  w
18260 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e  inFile *p = (win
18270 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75  File*)id;.  retu
18280 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
18290 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
182a0 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20  _OPEN |.        
182b0 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20   ((p->ctrlFlags 
182c0 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f  & WINFILE_PSOW)?
182d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
182e0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
182f0 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57  :0);.}../* .** W
18300 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
18310 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
18320 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
18330 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
18340 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
18350 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
18360 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
18370 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
18380 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
18390 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
183a0 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
183b0 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49  ize..*/.SYSTEM_I
183c0 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a  NFO winSysInfo;.
183d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
183e0 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
183f0 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73  Helper functions
18400 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
18410 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c  elinquish the gl
18420 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a  obal mutex. The.
18430 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  ** global mutex 
18440 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65  is used to prote
18450 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e  ct the winLockIn
18460 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  fo objects used 
18470 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65  by .** this file
18480 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
18490 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20  ay be shared by 
184a0 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
184b0 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
184c0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
184d0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
184e0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
184f0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
18500 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
18510 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
18520 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
18530 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
18540 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
18550 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
18560 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
18570 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
18580 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
18590 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
185a0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
185b0 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
185c0 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  d winShmEnterMut
185d0 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
185e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
185f0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
18600 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
18610 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
18620 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
18630 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76  nShmLeaveMutex(v
18640 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
18650 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
18660 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
18670 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
18680 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
18690 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
186a0 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  G.static int win
186b0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  ShmMutexHeld(voi
186c0 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
186d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
186e0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
186f0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
18700 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
18710 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
18720 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
18730 72 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67  represent a sing
18740 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  le file opened a
18750 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72  nd mmapped to pr
18760 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20  ovide.** shared 
18770 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75  memory.  When mu
18780 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61  ltiple threads a
18790 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  ll reference the
187a0 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   same.** log-sum
187b0 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61  mary, each threa
187c0 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69  d has its own wi
187d0 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75  nFile object, bu
187e0 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f  t they all.** po
187f0 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
18800 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
18810 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
18820 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a  er words, each.*
18830 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73  * log-summary is
18840 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63   opened only onc
18850 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a  e per process..*
18860 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  *.** winShmMutex
18870 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
18880 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  rue when creatin
18890 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a  g or destroying.
188a0 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f  ** this object o
188b0 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  r while reading 
188c0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66  or writing the f
188d0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
188e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66  .**.**      nRef
188f0 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a  .**      pNext .
18900 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
18910 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72  ing fields are r
18920 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74  ead-only after t
18930 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  he object is cre
18940 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20  ated:.** .**    
18950 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46    fid.**      zF
18960 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69  ilename.**.** Ei
18970 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  ther winShmNode.
18980 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
18990 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65  ld or winShmNode
189a0 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
189b0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
189c0 29 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72  ) is true when r
189d0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
189e0 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c  g any other fiel
189f0 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72  d.** in this str
18a00 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  ucture..**.*/.st
18a10 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
18a20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
18a30 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f  x *mutex;      /
18a40 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73  * Mutex to acces
18a50 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  s this object */
18a60 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
18a70 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
18a80 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
18a90 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68  e */.  winFile h
18aa0 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
18ab0 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
18ac0 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f   from winOpen */
18ad0 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  ..  int szRegion
18ae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18af0 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
18b00 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
18b10 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e  */.  int nRegion
18b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18b30 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
18b40 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73   apRegion */.  s
18b50 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
18b60 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61  {.    HANDLE hMa
18b70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p;             /
18b80 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
18b90 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  om CreateFileMap
18ba0 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64  ping */.    void
18bb0 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65   *pMap;.  } *aRe
18bc0 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61  gion;.  DWORD la
18bd0 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
18be0 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77     /* The Window
18bf0 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65  s errno from the
18c00 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20   last I/O error 
18c10 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20  */..  int nRef; 
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69   /* Number of wi
18c40 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
18c50 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
18c60 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73  .  winShm *pFirs
18c70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
18c80 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65   All winShm obje
18c90 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
18ca0 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
18cb0 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  Node *pNext;    
18cc0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20       /* Next in 
18cd0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53  list of all winS
18ce0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a  hmNode objects *
18cf0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18d00 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53  DEBUG.  u8 nextS
18d10 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
18d20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
18d30 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76  able winShm.id v
18d40 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
18d50 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61  ;../*.** A globa
18d60 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77  l array of all w
18d70 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
18d80 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  s..**.** The win
18d90 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
18da0 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c  ust be true whil
18db0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
18dc0 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a  ting this list..
18dd0 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d  */.static winShm
18de0 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65  Node *winShmNode
18df0 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
18e00 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
18e10 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
18e20 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
18e30 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
18e40 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
18e50 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
18e60 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
18e70 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
18e80 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
18e90 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
18ea0 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
18eb0 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
18ec0 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
18ed0 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e      winShm.pShmN
18ee0 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  ode.**    winShm
18ef0 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
18f00 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
18f10 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
18f20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d  winShm.pShmNode-
18f30 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
18f40 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
18f50 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
18f60 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
18f70 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b  .struct winShm {
18f80 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
18f90 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a  ShmNode;      /*
18fa0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
18fb0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
18fc0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  t */.  winShm *p
18fd0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
18fe0 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d    /* Next winShm
18ff0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77   with the same w
19000 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  inShmNode */.  u
19010 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
19020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19030 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
19040 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65   winShmNode mute
19050 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
19060 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
19070 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
19080 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
19090 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
190a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
190b0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
190c0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
190d0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
190e0 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
19110 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
19120 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20   its winShmNode 
19130 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
19140 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73  .** Constants us
19150 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a  ed for locking.*
19160 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
19170 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
19180 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
19190 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72  4)        /* fir
191a0 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a  st lock byte */.
191b0 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
191c0 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f  DMS    (WIN_SHM_
191d0 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
191e0 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
191f0 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
19200 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f  .** Apply adviso
19210 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
19220 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69   n bytes beginni
19230 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23  ng at ofst..*/.#
19240 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43  define _SHM_UNLC
19250 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48  K  1.#define _SH
19260 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69  M_RDLCK  2.#defi
19270 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33  ne _SHM_WRLCK  3
19280 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
19290 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
192a0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c  winShmNode *pFil
192b0 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c  e,    /* Apply l
192c0 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
192d0 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
192e0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
192f0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
19300 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b     /* _SHM_UNLCK
19310 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72  , _SHM_RDLCK, or
19320 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20   _SHM_WRLCK */. 
19330 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
19340 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
19350 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
19360 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f  o be locked/unlo
19370 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  cked */.  int nB
19380 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
19390 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
193a0 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  es to lock or un
193b0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lock */.){.  int
193c0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
193d0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
193e0 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f  e form Lock/Unlo
193f0 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20  ckFileEx() */.. 
19400 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
19410 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  e winShmNode obj
19420 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
19430 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
19440 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
19450 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19460 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c  pFile->mutex) ||
19470 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20   pFile->nRef==0 
19480 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
19490 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
194a0 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65  , lock=%d, offse
194b0 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22  t=%d, size=%d\n"
194c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
194d0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63  le->hFile.h, loc
194e0 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79  kType, ofst, nBy
194f0 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  te));..  /* Rele
19500 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
19510 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
19520 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
19530 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
19540 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
19550 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
19560 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c  ->hFile.h, ofst,
19570 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
19580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
19590 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
195a0 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
195b0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77   */.    DWORD dw
195c0 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45  Flags = LOCKFILE
195d0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
195e0 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  Y;.    if( lockT
195f0 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43  ype == _SHM_WRLC
19600 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c  K ) dwFlags |= L
19610 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
19620 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  E_LOCK;.    rc =
19630 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
19640 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77  ile->hFile.h, dw
19650 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20  Flags, ofst, 0, 
19660 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  nByte, 0);.  }. 
19670 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29   .  if( rc!= 0 )
19680 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19690 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
196a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
196b0 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
196c0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
196d0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
196e0 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
196f0 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
19700 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f  , func=%s, errno
19710 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  =%lu, rc=%s\n",.
19720 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19730 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b  ->hFile.h, (lock
19740 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c  Type == _SHM_UNL
19750 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b  CK) ? "winUnlock
19760 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20  File" :.        
19770 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22     "winLockFile"
19780 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
19790 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  no, sqlite3ErrNa
197a0 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74  me(rc)));..  ret
197b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
197c0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
197d0 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
197e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
197f0 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
19800 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
19810 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
19820 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
19830 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
19840 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
19850 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
19860 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
19870 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
19880 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
19890 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
198a0 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
198b0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
198c0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
198d0 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
198e0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
198f0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
19900 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
19910 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
19920 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
19930 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
19940 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
19950 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
19960 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
19970 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73  ShmNode *p;.  as
19980 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
19990 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54  xHeld() );.  OST
199a0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
199b0 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65   pid=%lu, delete
199c0 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Flag=%d\n",.    
199d0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
199e0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
199f0 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20  deleteFlag));.  
19a00 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
19a10 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
19a20 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
19a30 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
19a40 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
19a50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
19a60 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f  utex ){ sqlite3_
19a70 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
19a80 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f  tex); }.      fo
19a90 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
19aa0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
19ab0 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73     BOOL bRc = os
19ac0 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
19ad0 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d  p->aRegion[i].pM
19ae0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
19af0 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
19b00 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  -UNMAP pid=%lu, 
19b10 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
19b20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19b30 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
19b40 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
19b50 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
19b60 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
19b70 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42     UNUSED_VARIAB
19b80 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20  LE_VALUE(bRc);. 
19b90 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43         bRc = osC
19ba0 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52  loseHandle(p->aR
19bb0 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a  egion[i].hMap);.
19bc0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
19bd0 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53  ("SHM-PURGE-CLOS
19be0 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
19bf0 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
19c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c10 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
19c20 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
19c30 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
19c40 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
19c50 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
19c60 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
19c70 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
19c80 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
19c90 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
19ca0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
19cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
19cc0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
19cd0 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
19ce0 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
19cf0 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
19d00 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
19d10 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19d20 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
19d30 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
19d40 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
19d50 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
19d60 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
19d70 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
19d80 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
19d90 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
19da0 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
19db0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
19dc0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
19dd0 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
19de0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
19df0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
19e00 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
19e10 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
19e20 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
19e30 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
19e40 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
19e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
19e60 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
19e70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
19e80 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
19e90 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
19ea0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
19eb0 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
19ec0 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
19ed0 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
19ee0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
19ef0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
19f00 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
19f10 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
19f20 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
19f30 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
19f40 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
19f50 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
19f60 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
19f70 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
19f80 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
19f90 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
19fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19fb0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
19fc0 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
19fd0 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
19fe0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
19ff0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1a000 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
1a010 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
1a020 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
1a030 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
1a040 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1a050 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
1a060 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a080 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a090 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
1a0a0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
1a0b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1a0c0 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
1a0d0 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
1a0e0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a100 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
1a110 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
1a120 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1a130 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
1a140 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
1a150 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
1a160 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
1a170 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
1a180 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
1a190 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
1a1a0 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
1a1b0 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
1a1c0 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
1a1d0 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
1a1e0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
1a1f0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
1a200 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
1a210 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1a220 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1a230 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1a240 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
1a250 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
1a260 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1a270 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
1a280 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
1a290 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
1a2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1a2b0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1a2c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a2d0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
1a2e0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1a2f0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
1a300 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
1a310 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
1a320 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1a330 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
1a340 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
1a350 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
1a360 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
1a370 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
1a380 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
1a390 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
1a3a0 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
1a3b0 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
1a3c0 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
1a3d0 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
1a3e0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
1a3f0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
1a400 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
1a410 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1a420 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
1a430 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
1a440 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
1a450 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
1a460 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
1a470 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
1a480 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
1a490 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
1a4a0 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
1a4b0 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
1a4c0 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
1a4d0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
1a4e0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1a4f0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
1a500 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
1a510 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
1a520 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
1a530 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
1a540 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1a550 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a560 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
1a570 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
1a580 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
1a590 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
1a5a0 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
1a5b0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
1a5c0 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
1a5d0 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1a5e0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
1a5f0 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
1a600 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1a610 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1a620 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1a630 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1a640 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
1a650 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1a660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a670 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1a680 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1a690 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1a6a0 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
1a6b0 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
1a6d0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a6f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1a700 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1a720 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1a730 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
1a740 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
1a750 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
1a760 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1a770 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
1a780 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1a790 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1a7a0 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
1a7b0 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
1a7c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1a7d0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
1a7e0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1a7f0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
1a800 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
1a810 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
1a820 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
1a830 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
1a840 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
1a850 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1a860 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
1a870 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
1a880 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1a890 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1a8a0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1a8b0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1a8c0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1a8d0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1a8e0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1a8f0 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
1a900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a920 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1a930 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
1a940 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
1a950 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
1a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a970 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20    "winOpenShm", 
1a980 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1a990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a9a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1a9b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
1a9c0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1a9d0 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1a9e0 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1a9f0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
1aa00 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1aa10 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
1aa20 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
1aa30 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
1aa40 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1aa50 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1aa60 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1aa70 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1aa80 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
1aa90 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
1aaa0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1aab0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
1aac0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
1aad0 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
1aae0 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
1aaf0 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
1ab00 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
1ab10 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
1ab20 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
1ab30 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
1ab40 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
1ab50 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
1ab60 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
1ab70 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
1ab80 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
1ab90 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1aba0 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
1abb0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
1abc0 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
1abd0 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
1abe0 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
1abf0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
1ac00 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
1ac10 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
1ac20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
1ac30 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
1ac40 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
1ac50 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
1ac60 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
1ac70 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
1ac80 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1ac90 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1aca0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1acb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1acc0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1acd0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1ace0 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1acf0 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1ad00 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1ad10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ad20 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1ad30 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1ad40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1ad50 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1ad60 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1ad70 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
1ad80 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1ad90 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1ada0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1adb0 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
1adc0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1add0 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
1ade0 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1adf0 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1ae00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1ae10 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
1ae20 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
1ae30 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1ae40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ae50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1ae60 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
1ae70 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
1ae80 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
1ae90 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
1aea0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
1aeb0 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
1aec0 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
1aed0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1aee0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1aef0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1af00 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
1af10 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
1af20 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
1af30 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
1af40 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
1af50 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
1af60 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
1af70 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1af80 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
1af90 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
1afa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1afb0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1afc0 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
1afd0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1afe0 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
1aff0 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
1b000 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
1b010 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
1b020 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1b030 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
1b040 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
1b050 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
1b060 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
1b070 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1b080 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1b090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
1b0a0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1b0b0 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
1b0c0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
1b0d0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
1b0e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
1b0f0 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
1b100 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
1b110 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1b120 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1b130 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
1b140 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1b150 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
1b160 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
1b170 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
1b180 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
1b190 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
1b1a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1b1b0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
1b1c0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
1b1d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1b1e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1b1f0 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
1b200 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
1b210 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
1b220 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
1b230 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
1b240 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
1b250 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1b260 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
1b270 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1b280 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
1b290 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
1b2a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
1b2b0 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
1b2c0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1b2d0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
1b2e0 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
1b2f0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
1b300 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b310 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1b320 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
1b330 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
1b340 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
1b350 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
1b360 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
1b370 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1b380 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1b390 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1b3a0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1b3b0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b3d0 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
1b3e0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1b3f0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b410 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
1b420 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
1b430 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
1b440 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
1b450 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
1b460 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
1b470 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
1b480 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1b490 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
1b4a0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1b4b0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
1b4c0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
1b4d0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1b4e0 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1b4f0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
1b500 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
1b510 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
1b520 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b540 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1b550 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
1b560 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1b570 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1b580 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1b590 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5b0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1b5c0 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1b5f0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
1b600 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
1b610 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
1b620 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
1b630 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1b640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
1b650 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1b660 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1b670 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
1b680 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1b690 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1b6a0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1b6b0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1b6c0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
1b6d0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1b6e0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1b6f0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1b700 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1b710 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
1b720 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1b730 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
1b740 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1b750 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1b760 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
1b770 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
1b780 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
1b790 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
1b7a0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
1b7b0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
1b7c0 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
1b7d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1b7e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1b7f0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
1b800 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1b810 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
1b820 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
1b830 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1b840 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
1b850 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
1b860 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
1b870 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
1b880 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1b890 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1b8a0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1b8b0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
1b8c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1b8d0 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
1b8e0 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
1b8f0 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
1b900 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
1b910 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
1b920 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1b930 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
1b940 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
1b950 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
1b960 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
1b970 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
1b980 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1b990 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1b9a0 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  , _SHM_UNLCK, of
1b9b0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1b9c0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1b9d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b9e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
1b9f0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
1ba00 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
1ba10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ba20 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
1ba30 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1ba40 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1ba50 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1ba60 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
1ba70 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1ba80 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1ba90 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1baa0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1bab0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1bac0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1bad0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1bae0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1baf0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1bb00 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1bb10 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1bb20 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1bb30 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1bb40 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1bb50 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1bb60 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1bb70 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1bb80 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1bb90 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1bba0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1bbb0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1bbc0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1bbd0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1bbe0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1bbf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1bc00 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1bc10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1bc20 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1bc30 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1bc40 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1bc50 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1bc60 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1bc70 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1bc80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bc90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1bca0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1bcb0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1bcc0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1bcd0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1bce0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1bcf0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1bd00 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1bd10 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1bd20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bd30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1bd40 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
1bd50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
1bd60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1bd80 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1bd90 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1bda0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
1bdb0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1bdc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1bdd0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1bde0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
1bdf0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
1be00 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
1be10 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
1be20 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
1be30 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1be40 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1be50 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1be60 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1be70 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
1be80 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
1be90 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1bea0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1beb0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1bec0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1bed0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1bee0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1bef0 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1bf00 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1bf10 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1bf20 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1bf30 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1bf40 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1bf50 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1bf60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bf70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1bf80 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1bf90 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1bfa0 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
1bfb0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1bfc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1bfd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bfe0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
1bff0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1c000 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
1c010 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
1c020 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
1c030 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1c040 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1c050 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1c060 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1c070 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
1c080 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
1c090 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
1c0a0 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
1c0b0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1c0c0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1c0d0 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
1c0e0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1c0f0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
1c100 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
1c110 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1c120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1c130 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1c140 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1c150 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1c160 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
1c170 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1c180 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1c190 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1c1a0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1c1b0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1c1c0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1c1d0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1c1e0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1c1f0 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
1c200 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1c210 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
1c220 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1c230 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1c240 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
1c250 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
1c260 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72  ;.  /* MemoryBar
1c270 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20  rier(); // does 
1c280 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e  not work -- do n
1c290 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20  ot know why not 
1c2a0 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1c2b0 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68  Mutex();.  winSh
1c2c0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  mLeaveMutex();.}
1c2d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c2e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1c2f0 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e  to obtain a poin
1c300 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52  ter to region iR
1c310 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a  egion of the .**
1c320 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1c330 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1c340 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c350 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f   fd. Shared-memo
1c360 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61  ry regions .** a
1c370 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72  re numbered star
1c380 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20  ting from zero. 
1c390 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f  Each shared-memo
1c3a0 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52  ry region is szR
1c3b0 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20  egion .** bytes 
1c3c0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
1c3d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c3e0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1c3f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1c400 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1c410 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
1c420 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
1c430 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
1c440 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
1c450 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1c460 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
1c470 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1c480 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
1c490 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
1c4a0 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
1c4b0 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
1c4c0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
1c4d0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
1c4e0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1c4f0 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57  rned. If .** isW
1c500 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1c510 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1c520 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1c530 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1c540 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c  yet .** been all
1c550 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c  ocated, it is al
1c560 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
1c570 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1c580 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
1c590 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
1c5a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
1c5b0 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c  ocated or is all
1c5c0 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69  ocated by.** thi
1c5d0 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69  s call as descri
1c5e0 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20  bed above, then 
1c5f0 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74  it is mapped int
1c600 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1c610 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61   .** address spa
1c620 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ce (if it is not
1c630 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69   already), *pp i
1c640 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
1c650 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a  o the mapped .**
1c660 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
1c670 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1c680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1c690 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
1c6a0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1c6b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1c6c0 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
1c6d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c6e0 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
1c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c700 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
1c710 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
1c720 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
1c730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1c740 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
1c750 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
1c780 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
1c790 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
1c7a0 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1c7c0 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
1c7d0 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
1c7e0 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1c7f0 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
1c800 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1c810 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1c820 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1c830 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c840 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  ;..  if( !p ){. 
1c850 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53     rc = winOpenS
1c860 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46  haredMemory(pDbF
1c870 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
1c880 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1c890 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70  rn rc;.    p = p
1c8a0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
1c8b0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1c8c0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
1c8d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c8e0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c8f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52  );.  assert( szR
1c900 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
1c910 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
1c920 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
1c930 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
1c940 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1c950 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
1c960 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1c970 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
1c980 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
1c990 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
1c9a0 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
1c9b0 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
1c9c0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
1c9d0 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
1c9e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
1c9f0 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
1ca00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1ca10 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
1ca20 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
1ca30 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
1ca40 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
1ca50 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
1ca60 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
1ca70 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
1ca80 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1ca90 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1caa0 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
1cab0 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
1cac0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
1cad0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
1cae0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
1caf0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
1cb00 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1cb10 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1cb20 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
1cb30 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
1cb40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1cb50 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1cb60 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
1cb70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1cb80 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1cb90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1cba0 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1cbb0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbd0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1cbe0 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
1cbf0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
1cc00 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1cc10 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
1cc20 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
1cc30 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1cc40 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
1cc50 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
1cc60 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
1cc70 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
1cc80 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
1cc90 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
1cca0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
1ccb0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
1ccc0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
1ccd0 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
1cce0 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1ccf0 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
1cd00 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
1cd10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
1cd20 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1cd30 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
1cd40 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
1cd50 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
1cd60 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
1cd70 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
1cd80 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
1cd90 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
1cda0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
1cdb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cdc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
1cdd0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1cde0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
1cdf0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1ce00 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1ce20 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
1ce30 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
1ce40 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1ce50 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1ce60 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
1ce70 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
1ce80 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
1ce90 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
1cea0 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
1ceb0 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
1cec0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
1ced0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
1cee0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1cef0 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67  ->aRegion, (iReg
1cf00 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70  ion+1)*sizeof(ap
1cf10 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20  New[0]).    );. 
1cf20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b     if( !apNew ){
1cf30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cf40 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1cf50 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1cf60 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1cf70 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1cf80 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1cf90 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1cfa0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1cfb0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1cfc0 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1cfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1cfe0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1cff0 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1d000 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1d010 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1d020 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1d030 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45       .#if SQLITE
1d040 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1d050 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1d060 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
1d070 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  p(pShmNode->hFil
1d080 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e  e.h,.          N
1d090 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1d0a0 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  ITE, nByte, NULL
1d0b0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1d0c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1d0d0 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
1d0e0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1d0f0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
1d100 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1d110 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e  .h, .          N
1d120 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52  ULL, PAGE_READWR
1d130 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e  ITE, 0, nByte, N
1d140 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
1d150 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1d160 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1d170 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
1d180 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1d190 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngA(pShmNode->hF
1d1a0 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
1d1b0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1d1c0 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1d1d0 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1d1e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1d1f0 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
1d200 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
1d210 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
1d220 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1d230 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1d240 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1d250 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1d260 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
1d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
1d280 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1d290 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
1d2a0 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
1d2b0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1d2c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1d2d0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1d2e0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
1d2f0 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
1d300 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
1d310 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1d320 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
1d330 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
1d340 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1d350 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
1d360 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1d370 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1d380 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1d390 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1d3a0 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1d3b0 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1d3c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
1d3d0 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
1d3e0 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1d3f0 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1d400 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1d410 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1d420 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
1d430 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1d440 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1d450 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1d460 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1d470 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1d480 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  P-MAP pid=%lu, r
1d490 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74  egion=%d, offset
1d4a0 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1d4b0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1d4c0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d4d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d4e0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1d4f0 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20  ion, iOffset,.  
1d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1d510 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20  zRegion, pMap ? 
1d520 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1d530 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d540 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
1d550 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1d560 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1d570 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1d580 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1d590 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1d5a0 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d  ERR_SHMMAP, pShm
1d5b0 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  Node->lastErrno,
1d5c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d5d0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1d5e0 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
1d5f0 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
1d600 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
1d610 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
1d620 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1d630 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1d640 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
1d650 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1d660 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
1d670 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
1d680 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1d690 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1d6a0 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
1d6b0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1d6c0 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1d6d0 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1d6e0 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1d6f0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1d700 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
1d710 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
1d720 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1d730 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1d740 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1d750 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1d760 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1d770 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
1d780 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
1d790 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
1d7a0 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
1d7b0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
1d7c0 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
1d7d0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1d7e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1d7f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1d800 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1d810 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1d820 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
1d830 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
1d840 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
1d850 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1d860 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
1d870 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
1d880 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1d890 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1d8a0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1d8b0 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
1d8c0 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
1d8d0 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1d8e0 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
1d8f0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1d900 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
1d910 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
1d920 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1d930 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
1d940 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
1d950 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1d960 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1d970 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
1d980 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1d990 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
1d9a0 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
1d9b0 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
1d9c0 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
1d9d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d9e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1d9f0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1da00 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
1da10 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
1da20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1da30 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
1da40 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1da50 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
1da60 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
1da70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1da80 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
1da90 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1daa0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1dab0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1dac0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1dad0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1dae0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1daf0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1db00 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
1db10 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
1db30 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1db40 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
1db50 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1db60 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
1db70 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
1db80 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
1db90 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1dba0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1dbb0 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1dbc0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1dbf0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
1dc00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1dc10 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
1dc20 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1dc30 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
1dc40 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1dc50 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
1dc60 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
1dc70 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
1dc80 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
1dc90 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
1dca0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1dcb0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1dcc0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1dcd0 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1dce0 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1dcf0 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1dd00 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1dd10 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1dd30 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1dd40 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1dd50 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
1dd60 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1dd70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1dd80 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1dd90 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
1ddc0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1ddd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1dde0 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
1ddf0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1de00 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1de10 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1de20 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1de30 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1de40 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1de50 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
1de60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1de70 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
1de80 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
1de90 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
1dea0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1deb0 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
1dec0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
1ded0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
1dee0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
1def0 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
1df00 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20  ew). Or, if .** 
1df10 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  there already ex
1df20 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ists a mapping f
1df30 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  or this file, an
1df40 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  d there are stil
1df50 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  l .** outstandin
1df60 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
1df70 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
1df80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1df90 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
1dfa0 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
1dfb0 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
1dfc0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
1dfd0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
1dfe0 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  f .** the mappin
1dff0 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
1e000 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
1e010 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
1e020 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ro, then the .**
1e030 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1e040 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
1e050 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
1e060 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   The actual size
1e070 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74   of the.** creat
1e080 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69  ed mapping is ei
1e090 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74  ther the request
1e0a0 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76  ed size or the v
1e0b0 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
1e0c0 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
1e0d0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1e0e0 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
1e0f0 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
1e100 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e110 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
1e120 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
1e130 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
1e140 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
1e150 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
1e160 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
1e170 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
1e180 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
1e190 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1e1a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
1e1b0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
1e1c0 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
1e1d0 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
1e1e0 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
1e1f0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
1e200 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
1e210 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
1e220 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
1e230 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1e240 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1e250 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
1e260 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1e270 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1e280 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
1e290 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
1e2a0 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
1e2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e2c0 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
1e2d0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
1e2e0 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
1e2f0 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
1e300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
1e310 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1e320 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1e330 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1e340 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1e350 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
1e360 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1e370 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1e380 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
1e390 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e3a0 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
1e3b0 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
1e3c0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
1e3d0 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
1e3e0 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
1e3f0 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
1e400 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
1e410 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
1e420 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20  e - 1);. .  if( 
1e430 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e  nMap==0 && pFd->
1e440 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1e450 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1e460 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  Fd);.  }.  if( n
1e470 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
1e480 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  ze ){.    void *
1e490 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57  pNew = 0;.    DW
1e4a0 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41  ORD protect = PA
1e4b0 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  GE_READONLY;.   
1e4c0 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46   DWORD flags = F
1e4d0 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20  ILE_MAP_READ;.. 
1e4e0 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1e4f0 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70  pFd);.    if( (p
1e500 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
1e510 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  WINFILE_RDONLY)=
1e520 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74  =0 ){.      prot
1e530 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57  ect = PAGE_READW
1e540 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67  RITE;.      flag
1e550 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52  s |= FILE_MAP_WR
1e560 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53  ITE;.    }.#if S
1e570 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1e580 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
1e590 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1e5a0 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68  ngFromApp(pFd->h
1e5b0 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1e5c0 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65   nMap, NULL);.#e
1e5d0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1e5e0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
1e5f0 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  E).    pFd->hMap
1e600 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1e610 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20  appingW(pFd->h, 
1e620 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1e650 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1e660 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1e670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e690 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1e6a0 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1e6b0 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
1e6c0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1e6d0 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64  AS_ANSI).    pFd
1e6e0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1e6f0 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46  eFileMappingA(pF
1e700 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1e710 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
1e740 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
1e750 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
1e780 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
1e790 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  ), NULL);.#endif
1e7a0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d  .    if( pFd->hM
1e7b0 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap==NULL ){.    
1e7c0 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
1e7d0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1e7e0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
1e7f0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1e800 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1e810 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e830 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
1e840 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e1", pFd->zPath)
1e850 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1e860 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1e870 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1e880 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1e890 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1e8a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1e8b0 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
1e8c0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1e8d0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1e8e0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1e8f0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1e900 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
1e910 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1e920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e930 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e940 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20  assert( (nMap % 
1e950 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1e960 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20  eSize)==0 );.   
1e970 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1e980 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28  SIZE_T)==sizeof(
1e990 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c  sqlite3_int64) |
1e9a0 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66  | nMap<=0xffffff
1e9b0 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ff );.#if SQLITE
1e9c0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e  _OS_WINRT.    pN
1e9d0 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
1e9e0 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d  FileFromApp(pFd-
1e9f0 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
1ea00 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a   (SIZE_T)nMap);.
1ea10 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
1ea20 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1ea30 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67  (pFd->hMap, flag
1ea40 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54  s, 0, 0, (SIZE_T
1ea50 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20  )nMap);.#endif. 
1ea60 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c     if( pNew==NUL
1ea70 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  L ){.      osClo
1ea80 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d  seHandle(pFd->hM
1ea90 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ap);.      pFd->
1eaa0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hMap = NULL;.   
1eab0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
1eac0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1ead0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
1eae0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1eaf0 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1eb00 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
1eb30 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le2", pFd->zPath
1eb40 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
1eb50 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
1eb60 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
1eb70 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
1eb80 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
1eb90 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
1eba0 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d  AP-FILE-MAP pid=
1ebb0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1ebc0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1ebd0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1ebe0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ebf0 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
1ec00 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1ec10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ec20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
1ec30 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
1ec40 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  pNew;.    pFd->m
1ec50 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
1ec60 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
1ec70 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a  eActual = nMap;.
1ec80 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
1ec90 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1eca0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1ecb0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1ecc0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1ecd0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1ece0 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72  , pFd));.  retur
1ecf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1ed00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1ed10 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
1ed20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
1ed30 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
1ed40 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
1ed50 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
1ed60 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
1ed70 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
1ed80 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
1ed90 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
1eda0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
1edb0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
1edc0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
1edd0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
1ede0 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
1edf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1ee00 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
1ee10 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
1ee20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
1ee30 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
1ee40 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
1ee50 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
1ee60 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
1ee70 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1ee80 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
1ee90 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
1eea0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
1eeb0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1eec0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
1eed0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
1eee0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
1eef0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
1ef00 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65  ventually .** re
1ef10 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
1ef20 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
1ef30 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
1ef40 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
1ef50 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
1ef60 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
1ef70 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
1ef80 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
1ef90 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1efa0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
1efb0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1efc0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1efd0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
1efe0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
1eff0 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
1f000 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
1f010 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
1f020 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
1f030 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
1f040 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1f050 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1f060 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
1f070 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
1f080 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1f090 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
1f0a0 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
1f0b0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
1f0c0 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
1f0d0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
1f0e0 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
1f0f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f100 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f110 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1f120 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1f130 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
1f140 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f150 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f160 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1f170 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1f180 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
1f190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f1a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1f1b0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
1f1c0 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
1f1d0 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
1f1e0 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
1f1f0 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
1f200 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
1f210 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
1f220 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
1f230 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
1f240 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
1f250 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
1f260 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1f270 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f280 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
1f290 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
1f2a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1f2c0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
1f2d0 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
1f2e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1f2f0 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72  releases a .** r
1f300 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65  eference obtaine
1f310 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
1f320 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68  call to winFetch
1f330 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
1f340 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
1f350 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1f360 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
1f370 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
1f380 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
1f390 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
1f3a0 73 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46  ssed to the winF
1f3b0 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f  etch() invocatio
1f3c0 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  n. .**.** Or, if
1f3d0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
1f3e0 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ent is NULL, the
1f3f0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1f400 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
1f410 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
1f420 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
1f430 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
1f440 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
1f450 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d  ng mapping .** m
1f460 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69  ay now be invali
1f470 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20  d and should be 
1f480 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61  unmapped..*/.sta
1f490 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74  tic int winUnfet
1f4a0 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
1f4b0 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76  *fd, i64 iOff, v
1f4c0 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c  oid *p){.#if SQL
1f4d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1f4e0 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
1f4f0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1f500 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
1f510 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
1f520 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  file */..  /* If
1f530 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65   p==0 (unmap the
1f540 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68   entire file) th
1f550 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1f560 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1f570 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
1f580 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
1f590 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
1f5a0 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
1f5b0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
1f5c0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
1f5d0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
1f5e0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
1f5f0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
1f600 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
1f610 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
1f620 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
1f630 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
1f640 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
1f650 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
1f660 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
1f670 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
1f680 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
1f690 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1f6a0 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
1f6b0 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
1f6c0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f6d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f6e0 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
1f6f0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
1f700 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
1f710 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
1f720 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
1f730 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
1f740 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
1f750 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
1f760 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
1f770 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
1f780 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
1f790 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
1f7a0 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
1f7b0 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
1f7c0 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20  cessary can can 
1f7d0 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74  be omitted - pot
1f7e0 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69  entially improvi
1f7f0 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72  ng.    ** perfor
1f800 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77  mance.  */.    w
1f810 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
1f820 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1f830 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
1f840 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
1f850 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
1f860 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
1f870 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1f880 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1f890 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f8a0 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a  cessId(), fd));.
1f8b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f8c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
1f8d0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
1f8e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
1f8f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
1f900 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
1f910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f920 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
1f930 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
1f940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f950 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1f960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f9a0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1f9b0 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
1f9c0 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
1f9d0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
1f9e0 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
1f9f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
1fa00 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
1fa10 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1fa20 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
1fa30 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20  ethod = {.  3,  
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1fa60 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
1fa70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa90 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
1faa0 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fac0 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
1fad0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1fae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
1faf0 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
1fb00 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1fb10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
1fb20 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
1fb30 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1fb40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1fb50 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
1fb60 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1fb70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1fb80 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
1fb90 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1fba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1fbb0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
1fbc0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1fbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1fbe0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
1fbf0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
1fc00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
1fc10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1fc20 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
1fc30 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
1fc40 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1fc50 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
1fc60 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
1fc70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1fc80 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
1fc90 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1fca0 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
1fcb0 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1fcc0 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
1fcd0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fcf0 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
1fd00 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fd20 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
1fd30 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd50 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
1fd60 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20   winShmUnmap,   
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
1fd90 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20  .  winFetch,    
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a     /* xFetch */.
1fdc0 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20    winUnfetch    
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fde0 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
1fdf0 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
1fe00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe40 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1fe50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1fe60 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
1fe70 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1fe80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fe90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
1fea0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
1feb0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1fec0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
1fed0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
1fee0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69  s object..*/..#i
1fef0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
1ff00 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  IN__)./*.** Conv
1ff10 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66  ert a filename f
1ff20 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65  rom whatever the
1ff30 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
1ff40 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20  ating system.** 
1ff50 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c  supports for fil
1ff60 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d  enames into UTF-
1ff70 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
1ff80 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a  d the result is.
1ff90 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
1ffa0 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
1ffb0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1ffc0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1ffd0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
1ffe0 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55  r *winConvertToU
1fff0 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
20000 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
20010 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e  e){.  char *zCon
20020 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
20030 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
20040 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
20050 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
20060 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
20070 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
20080 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
20090 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  lse{.    zConver
200a0 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  ted = sqlite3_wi
200b0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
200c0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
200d0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c  .#endif.  /* cal
200e0 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
200f0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
20100 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
20110 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rted;.}.#endif..
20120 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
20130 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
20140 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
20150 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
20160 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
20170 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
20180 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
20190 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
201a0 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
201b0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
201c0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
201d0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
201e0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
201f0 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43  tatic void *winC
20200 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
20210 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
20220 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
20230 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
20240 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
20250 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
20260 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66  nverted = winUtf
20270 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
20280 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
20290 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
202a0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
202b0 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
202c0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
202d0 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c  tf8_to_mbcs(zFil
202e0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
202f0 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
20300 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
20310 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
20320 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
20330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20340 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
20350 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
20360 73 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20  specified UTF-8 
20370 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a  string buffer.**
20380 20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72   ends with a dir
20390 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
203a0 20 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e   character or on
203b0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
203c0 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69  ly.** added to i
203d0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
203e0 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72   winMakeEndInDir
203f0 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  Sep(int nBuf, ch
20400 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28  ar *zBuf){.  if(
20410 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74   zBuf ){.    int
20420 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53   nLen = sqlite3S
20430 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
20440 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b     if( nLen>0 ){
20450 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
20460 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e  DirSep(zBuf[nLen
20470 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
20480 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
20490 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31  }else if( nLen+1
204a0 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  <nBuf ){.       
204b0 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69   zBuf[nLen] = wi
204c0 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20  nGetDirSep();.  
204d0 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b        zBuf[nLen+
204e0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  1] = '\0';.     
204f0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
20510 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
20520 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
20530 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
20540 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
20550 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72  esulting pointer
20560 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20   into pzBuf..** 
20570 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
20580 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75  rned in pzBuf mu
20590 73 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20  st be freed via 
205a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
205b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
205c0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c  nGetTempname(sql
205d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
205e0 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20  char **pzBuf){. 
205f0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68   static char zCh
20600 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
20610 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
20620 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
20630 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
20640 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
20650 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69  123456789";.  si
20660 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74  ze_t i, j;.  int
20670 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53   nPre = sqlite3S
20680 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
20690 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
206a0 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42  ;.  int nMax, nB
206b0 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a  uf, nDir, nLen;.
206c0 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20    char *zBuf;.. 
206d0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
206e0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
206f0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
20700 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
20710 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
20720 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
20730 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
20740 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
20750 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
20760 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
20770 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
20780 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
20790 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
207a0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
207b0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
207c0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
207d0 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
207e0 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20   file.  ** name 
207f0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
20800 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73  y file.  If this
20810 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f   fails, we canno
20820 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f  t continue..  */
20830 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e  .  nMax = pVfs->
20840 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66  mxPathname; nBuf
20850 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a   = nMax + 2;.  z
20860 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Buf = sqlite3Mal
20870 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b  locZero( nBuf );
20880 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a  .  if( !zBuf ){.
20890 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
208a0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
208b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
208c0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  M\n"));.    retu
208d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
208e0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
208f0 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
20900 65 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72  effective tempor
20910 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
20920 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20  First, check if 
20930 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65  one.  ** has bee
20940 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  n explicitly set
20950 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
20960 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  ion; otherwise, 
20970 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a  use the one.  **
20980 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
20990 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
209a0 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72  tem..  */.  nDir
209b0 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20   = nMax - (nPre 
209c0 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28  + 15);.  assert(
209d0 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28   nDir>0 );.  if(
209e0 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
209f0 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69  rectory ){.    i
20a00 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c  nt nDirLen = sql
20a10 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
20a20 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
20a30 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  ory);.    if( nD
20a40 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20  irLen>0 ){.     
20a50 20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65   if( !winIsDirSe
20a60 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  p(sqlite3_temp_d
20a70 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e  irectory[nDirLen
20a80 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
20a90 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20  nDirLen++;.     
20aa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69   }.      if( nDi
20ab0 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20  rLen>nDir ){.   
20ac0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20ad0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
20ae0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
20af0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
20b00 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
20b10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
20b20 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
20b30 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
20b40 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29  etTempname1", 0)
20b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20b60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
20b70 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
20b80 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
20b90 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  directory);.    
20ba0 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  }.  }.#if define
20bb0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
20bc0 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
20bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
20be0 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  irs[] = {.      
20bf0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53   0, /* getenv("S
20c00 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a  QLITE_TMPDIR") *
20c10 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
20c20 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20  etenv("TMPDIR") 
20c30 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
20c40 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f  getenv("TMP") */
20c50 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
20c60 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a  tenv("TEMP") */.
20c70 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
20c80 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
20c90 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76  ") */.       "/v
20ca0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  ar/tmp",.       
20cb0 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
20cc0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
20cd0 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20    ".",.       0 
20ce0 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
20cf0 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20  erminator */.   
20d00 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   };.    unsigned
20d10 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73   int i;.    cons
20d20 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30  t char *zDir = 0
20d30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  ;..    if( !azDi
20d40 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30  rs[0] ) azDirs[0
20d50 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49  ] = getenv("SQLI
20d60 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  TE_TMPDIR");.   
20d70 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20   if( !azDirs[1] 
20d80 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65  ) azDirs[1] = ge
20d90 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a  tenv("TMPDIR");.
20da0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
20db0 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d  2] ) azDirs[2] =
20dc0 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a   getenv("TMP");.
20dd0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
20de0 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d  3] ) azDirs[3] =
20df0 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b   getenv("TEMP");
20e00 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73  .    if( !azDirs
20e10 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20  [4] ) azDirs[4] 
20e20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  = getenv("USERPR
20e30 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72  OFILE");.    for
20e40 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
20e50 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
20e60 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61  Dirs[0]); zDir=a
20e70 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20  zDirs[i++]){.   
20e80 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72     void *zConver
20e90 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ted;.      if( z
20ea0 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
20eb0 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e;.      /* If t
20ec0 68 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77  he path starts w
20ed0 69 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74  ith a drive lett
20ee0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  er followed by t
20ef0 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a  he colon.      *
20f00 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73  * character, ass
20f10 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64  ume it is alread
20f20 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  y a native Win32
20f30 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65   path; otherwise
20f40 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75  ,.      ** it mu
20f50 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  st be converted 
20f60 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33  to a native Win3
20f70 32 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43  2 path via the C
20f80 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20  ygwin API.      
20f90 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e  ** prior to usin
20fa0 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  g it..      */. 
20fb0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72       if( winIsDr
20fc0 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
20fd0 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20  n(zDir) ){.     
20fe0 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20ff0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
21000 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29  f8Filename(zDir)
21010 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
21020 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
21030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21040 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
21050 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
21060 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
21070 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21080 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
21090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
210a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
210b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
210c0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
210d0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
210e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
210f0 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
21100 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a  f, "%s", zDir);.
21110 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21120 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
21130 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  d);.          br
21140 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
21150 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21160 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
21170 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21180 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
21190 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
211a0 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a  Zero( nMax+1 );.
211b0 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f          if( !zCo
211c0 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
211d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
211e0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
211f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21200 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21210 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21220 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
21230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
21240 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
21250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21260 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
21270 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
21280 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43      osIsNT() ? C
21290 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
212a0 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  W : CCP_POSIX_TO
212b0 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20  _WIN_A, zDir,.  
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
212d0 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31  onverted, nMax+1
212e0 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )<0 ){.         
212f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
21300 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21310 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21320 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
21330 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21340 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21350 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
21360 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
21370 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
21380 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
21390 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  ERR_CONVPATH, (D
213a0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74           "winGet
213d0 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72  Tempname2", zDir
213e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
213f0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
21400 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
21410 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  .          /* At
21420 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
21430 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61  know the candida
21440 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69  te directory exi
21450 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20  sts and should. 
21460 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75           ** be u
21470 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  sed.  However, w
21480 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f  e may need to co
21490 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67  nvert the string
214a0 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
214b0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d        ** its nam
214c0 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e  e into UTF-8 (i.
214d0 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d  e. if it is UTF-
214e0 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20  16 right now).. 
214f0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
21500 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
21510 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
21520 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f  Utf8Filename(zCo
21530 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
21540 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
21550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
21560 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
21570 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
21580 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21590 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
215a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
215b0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
215c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
215d0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
215e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
215f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
21600 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
21620 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
21630 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
21640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21650 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
21660 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21670 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
21680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
21690 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
216a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
216b0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
216c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
216d0 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f  }.#elif !SQLITE_
216e0 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
216f0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
21700 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73  .  else if( osIs
21710 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NT() ){.    char
21720 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50   *zMulti;.    LP
21730 57 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d  WSTR zWidePath =
21740 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
21750 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28  ro( nMax*sizeof(
21760 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66  WCHAR) );.    if
21770 28 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a  ( !zWidePath ){.
21780 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21790 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
217a0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
217b0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
217c0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
217d0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
217e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
217f0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  MEM;.    }.    i
21800 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  f( osGetTempPath
21810 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74  W(nMax, zWidePat
21820 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h)==0 ){.      s
21830 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
21840 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
21850 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
21860 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
21870 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
21880 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
21890 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
218a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
218b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
218c0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
218d0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
218e0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
21910 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
21920 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69   zMulti = winUni
21930 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65  codeToUtf8(zWide
21940 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a  Path);.    if( z
21950 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73  Multi ){.      s
21960 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
21970 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
21980 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  , zMulti);.     
21990 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
219a0 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c  ulti);.      sql
219b0 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
219c0 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ath);.    }else{
219d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
219e0 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
219f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21a00 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
21a10 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21a20 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
21a30 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
21a40 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
21a50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
21a60 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
21a70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
21a80 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
21a90 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
21aa0 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tf8;.    char *z
21ab0 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74  MbcsPath = sqlit
21ac0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
21ad0 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ax );.    if( !z
21ae0 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20  MbcsPath ){.    
21af0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21b00 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
21b10 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
21b20 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
21b30 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
21b40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21b50 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
21b60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
21b70 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d  sGetTempPathA(nM
21b80 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d  ax, zMbcsPath)==
21b90 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
21ba0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
21bb0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
21bc0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
21bd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
21be0 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20  TEMPPATH\n"));. 
21bf0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
21c00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
21c10 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
21c20 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
21c30 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
21c50 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20  nGetTempname3", 
21c60 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  0);.    }.    zU
21c70 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
21c80 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
21c90 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
21ca0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
21cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
21cc0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
21cd0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
21ce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21cf0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
21d00 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
21d10 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
21d20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
21d30 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
21d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21d50 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
21d60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21d70 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
21d80 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
21d90 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
21da0 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  NSI */.#endif /*
21db0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
21dc0 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T */..  /*.  ** 
21dd0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
21de0 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
21df0 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20   directory ends 
21e00 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69  with an appropri
21e10 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74  ate.  ** separat
21e20 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  or.  If it does 
21e30 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73  not and there is
21e40 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63   not enough spac
21e50 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20  e left to add.  
21e60 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20  ** one, fail..  
21e70 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b  */.  if( !winMak
21e80 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69  eEndInDirSep(nDi
21e90 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20  r+1, zBuf) ){.  
21ea0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21eb0 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
21ec0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
21ed0 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
21ee0 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
21ef0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
21f00 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
21f10 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34  "winGetTempname4
21f20 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ", 0);.  }..  /*
21f30 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  .  ** Check that
21f40 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
21f50 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
21f60 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
21f70 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
21f80 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c  name in the foll
21f90 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20  owing format:.  
21fa0 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70  **.  **   "<temp
21fb0 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e  orary_directory>
21fc0 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58  /etilqs_XXXXXXXX
21fd0 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a  XXXXXXX\0\0".  *
21fe0 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72  *.  ** If not, r
21ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22000 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  OR.  The number 
22010 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20  17 is used here 
22020 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
22030 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
22040 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
22050 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20  he 15 character 
22060 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e  random suffix an
22070 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74  d the.  ** two t
22080 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72  railing NUL char
22090 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e  acters.  The fin
220a0 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70  al directory sep
220b0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
220c0 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  .  ** has alread
220d0 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61  y added if it wa
220e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72  s not already pr
220f0 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c  esent..  */.  nL
22100 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
22110 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66  en30(zBuf);.  if
22120 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b  ( (nLen + nPre +
22130 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20   17) > nBuf ){. 
22140 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22150 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41  zBuf);.    OSTRA
22160 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22170 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
22180 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74  OR\n"));.    ret
22190 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
221a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c  SQLITE_ERROR, 0,
221b0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
221c0 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  5", 0);.  }..  s
221d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
221e0 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42  nBuf-16-nLen, zB
221f0 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f  uf+nLen, SQLITE_
22200 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
22210 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65  );..  j = sqlite
22220 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
22230 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
22240 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
22250 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  j]);.  for(i=0; 
22260 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
22270 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28  .    zBuf[j] = (
22280 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
22290 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
222a0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
222b0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a  hars)-1) ];.  }.
222c0 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20    zBuf[j] = 0;. 
222d0 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
222e0 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b    *pzBuf = zBuf;
222f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ..  OSTRACE(("TE
22300 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65  MP-FILENAME name
22310 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%s, rc=SQLITE_O
22320 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20  K\n", zBuf));.  
22330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22350 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
22360 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c  med file is real
22370 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20  ly a directory. 
22380 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
22390 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68  .** it is someth
223a0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
223b0 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69   directory, or i
223c0 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
223d0 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ind of memory.**
223e0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
223f0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
22400 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
22410 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74  t void *zConvert
22420 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  ed){.  DWORD att
22430 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
22440 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
22450 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e  no;..  if( osIsN
22460 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
22470 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
22480 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
22490 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
224a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
224b0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
224c0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
224d0 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
224e0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
224f0 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
22500 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
22530 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
22540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
22560 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69  AttrData)) && wi
22570 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
22580 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
22590 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b  }.    if( !rc ){
225a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
225b0 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65   /* Invalid name
225c0 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61  ? */.    }.    a
225d0 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
225e0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
225f0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
22600 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65  WINCE==0.  }else
22610 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
22620 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
22630 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
22640 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
22650 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21  .  return (attr!
22660 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
22670 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74  TRIBUTES) && (at
22680 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
22690 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a  E_DIRECTORY);.}.
226a0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
226b0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
226c0 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c  t winOpen(.  sql
226d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
226e0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
226f0 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61  o get maximum pa
22700 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a  th name length *
22710 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22720 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  zName,        /*
22730 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
22740 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
22750 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
22760 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
22770 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
22780 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
22790 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227b0 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20  Open mode flags 
227c0 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
227d0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
227e0 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20  * Status return 
227f0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41  flags */.){.  HA
22800 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20  NDLE h;.  DWORD 
22810 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
22820 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64   DWORD dwDesired
22830 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20  Access;.  DWORD 
22840 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44  dwShareMode;.  D
22850 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44  WORD dwCreationD
22860 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57  isposition;.  DW
22870 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74  ORD dwFlagsAndAt
22880 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69  tributes = 0;.#i
22890 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
228a0 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d  E.  int isTemp =
228b0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e   0;.#endif.  win
228c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
228d0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f  inFile*)id;.  vo
228e0 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20  id *zConverted; 
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22900 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65  Filename in OS e
22910 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e  ncoding */.  con
22920 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61  st char *zUtf8Na
22930 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46  me = zName; /* F
22940 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38  ilename in UTF-8
22950 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
22960 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  nt cnt = 0;..  /
22970 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
22980 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
22990 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
229a0 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
229b0 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
229c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
229d0 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
229e0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
229f0 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
22a00 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65    char *zTmpname
22a10 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d   = 0; /* For tem
22a20 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c  porary filename,
22a30 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a   if necessary. *
22a40 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  /..  int rc = SQ
22a50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
22a60 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
22a70 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23  Return Code */.#
22a80 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
22a90 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  UG) || SQLITE_OS
22aa0 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79  _WINCE.  int eTy
22ab0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
22ac0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
22ad0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
22ae0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74  */.#endif..  int
22af0 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
22b00 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
22b10 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
22b20 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
22b30 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
22b40 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
22b50 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
22b60 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
22b70 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
22b80 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
22b90 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
22ba0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
22bb0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
22bc0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
22bd0 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
22be0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22bf0 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65  DWRITE);..#ifnde
22c00 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69  f NDEBUG.  int i
22c10 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  sOpenJournal = (
22c20 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20  isCreate && (.  
22c30 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c        eType==SQL
22c40 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
22c50 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
22c60 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
22c70 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
22c80 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
22c90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
22ca0 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
22cb0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
22cc0 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
22cd0 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
22ce0 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
22cf0 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
22d00 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
22d10 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
22d20 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
22d30 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
22d40 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
22d50 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
22d60 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
22d70 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
22d80 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
22d90 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
22da0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
22db0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
22dc0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
22dd0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
22de0 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
22df0 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
22e00 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
22e10 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
22e20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
22e30 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
22e40 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
22e50 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
22e60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
22e70 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
22e80 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
22e90 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
22ea0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
22eb0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
22ec0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
22ed0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
22ee0 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
22ef0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
22f00 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
22f10 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
22f20 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
22f30 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
22f40 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
22f50 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
22f60 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
22f70 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
22f80 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
22f90 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
22fa0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
22fb0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
22fc0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
22fd0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
22fe0 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
22ff0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
23000 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
23010 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
23020 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
23030 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
23040 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
23050 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
23060 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
23070 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
23080 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
23090 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
230a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
230b0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
230c0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
230d0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
230e0 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
230f0 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
23100 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
23110 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23120 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
23130 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
23140 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
23150 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23160 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
23170 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
23180 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
23190 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
231a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
231b0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c  N_SUBJOURNAL   |
231c0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
231d0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
231e0 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  NAL .       || e
231f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23200 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
23210 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23220 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20  OPEN_WAL.  );.. 
23230 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d   assert( pFile!=
23240 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  0 );.  memset(pF
23250 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ile, 0, sizeof(w
23260 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c  inFile));.  pFil
23270 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48  e->h = INVALID_H
23280 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69  ANDLE_VALUE;..#i
23290 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
232a0 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61  T.  if( !zUtf8Na
232b0 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74  me && !sqlite3_t
232c0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b  emp_directory ){
232d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
232e0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20  (SQLITE_ERROR,. 
232f0 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f         "sqlite3_
23300 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76  temp_directory v
23310 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62  ariable should b
23320 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22  e set for WinRT"
23330 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
23340 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e   /* If the secon
23350 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
23360 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e  is function is N
23370 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ULL, generate a 
23380 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
23390 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
233a0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55   .  */.  if( !zU
233b0 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
233c0 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20  ssert( isDelete 
233d0 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
233e0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  l );.    rc = wi
233f0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  nGetTempname(pVf
23400 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  s, &zTmpname);. 
23410 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  E_OK ){.      OS
23430 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
23440 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55  e=%s, rc=%s", zU
23450 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  tf8Name, sqlite3
23460 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
23470 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23480 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
23490 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
234a0 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
234b0 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
234c0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
234d0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
234e0 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
234f0 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
23500 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
23510 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
23520 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
23530 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
23540 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
23550 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
23560 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23570 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
23580 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
23590 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38   ||.       zUtf8
235a0 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  Name[sqlite3Strl
235b0 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b  en30(zUtf8Name)+
235c0 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  1]==0 );..  /* C
235d0 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
235e0 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
235f0 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
23600 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
23610 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
23620 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
23630 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
23640 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
23650 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
23660 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
23670 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
23680 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
23690 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66  ERR_NOMEM", zUtf
236a0 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
236b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
236c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69  _NOMEM;.  }..  i
236d0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
236e0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73  verted) ){.    s
236f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
23700 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
23710 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
23720 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
23730 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
23740 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
23750 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66  PEN_ISDIR", zUtf
23760 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
23770 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
23780 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a  PEN_ISDIR;.  }..
23790 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
237a0 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  e ){.    dwDesir
237b0 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
237c0 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
237d0 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
237e0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
237f0 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
23800 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
23810 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
23820 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f  USIVE is used to
23830 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
23840 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20  a new file is . 
23850 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c   ** created. SQL
23860 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20  ite doesn't use 
23870 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22  it to indicate "
23880 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
23890 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73  " .  ** as it is
238a0 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74   usually underst
238b0 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ood..  */.  if( 
238c0 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  isExclusive ){. 
238d0 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20     /* Creates a 
238e0 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  new file, only i
238f0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
23900 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a  ready exist. */.
23910 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
23920 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61  le exists, it fa
23930 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  ils. */.    dwCr
23940 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
23950 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a  n = CREATE_NEW;.
23960 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72    }else if( isCr
23970 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  eate ){.    /* O
23980 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c  pen existing fil
23990 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20  e, or create if 
239a0 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  it doesn't exist
239b0 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
239c0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
239d0 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d  OPEN_ALWAYS;.  }
239e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  else{.    /* Ope
239f0 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20  ns a file, only 
23a00 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f  if it exists. */
23a10 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
23a20 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
23a30 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a  N_EXISTING;.  }.
23a40 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d  .  dwShareMode =
23a50 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
23a60 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52   | FILE_SHARE_WR
23a70 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65  ITE;..  if( isDe
23a80 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49  lete ){.#if SQLI
23a90 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
23aa0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
23ab0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
23ac0 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20  IBUTE_HIDDEN;.  
23ad0 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65    isTemp = 1;.#e
23ae0 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41  lse.    dwFlagsA
23af0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
23b00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
23b10 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20  MPORARY.        
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54         | FILE_AT
23b40 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20  TRIBUTE_HIDDEN. 
23b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
23b70 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
23b80 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69  _ON_CLOSE;.#endi
23b90 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  f.  }else{.    d
23ba0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
23bb0 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
23bc0 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  BUTE_NORMAL;.  }
23bd0 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72  .  /* Reports fr
23be0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20  om the internet 
23bf0 61 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d  are that perform
23c00 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20  ance is always. 
23c10 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49   ** better if FI
23c20 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
23c30 43 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20  CCESS is used.  
23c40 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f  Ticket #2699. */
23c50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
23c60 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e  INCE.  dwFlagsAn
23c70 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46  dAttributes |= F
23c80 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
23c90 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a  ACCESS;.#endif..
23ca0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
23cb0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
23cc0 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45  WINRT.    CREATE
23cd0 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
23ce0 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64  ARAMETERS extend
23cf0 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20  edParameters;.  
23d00 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
23d10 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69  ters.dwSize = si
23d20 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32  zeof(CREATEFILE2
23d30 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
23d40 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e  TERS);.    exten
23d50 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
23d60 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d  FileAttributes =
23d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46  .            dwF
23d80 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
23d90 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s & FILE_ATTRIBU
23da0 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74  TE_MASK;.    ext
23db0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
23dc0 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77  dwFileFlags = dw
23dd0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
23de0 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  es & FILE_FLAG_M
23df0 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
23e00 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65  dParameters.dwSe
23e10 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d  curityQosFlags =
23e20 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d   SECURITY_ANONYM
23e30 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  OUS;.    extende
23e40 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65  dParameters.lpSe
23e50 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73  curityAttributes
23e60 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74   = NULL;.    ext
23e70 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
23e80 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20  hTemplateFile = 
23e90 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28  NULL;.    while(
23ea0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
23eb0 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  le2((LPCWSTR)zCo
23ec0 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
23ef0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
23f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f10 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
23f20 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
23f50 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
23f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f70 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
23f80 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56  arameters))==INV
23f90 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
23fa0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
23fd0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
23fe0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
23ff0 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
24000 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
24010 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
24020 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53  eateFileW((LPCWS
24030 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
24040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
24060 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
24090 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
240c0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
240d0 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240f0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
24100 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
24130 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
24140 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24160 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
24170 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
24180 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
24190 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
241a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
241b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
241c0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
241d0 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65   else{.    while
241e0 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
241f0 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f  ileA((LPCSTR)zCo
24200 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
24230 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24250 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
24260 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24280 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
24290 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242b0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
242c0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
242d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242f0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
24300 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
24330 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
24340 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
24350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24360 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
24370 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69  .  }.#endif.  wi
24380 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a  nLogIoerr(cnt);.
24390 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
243a0 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
243b0 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
243c0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
243d0 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  f8Name,.        
243e0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
243f0 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f  ss, (h==INVALID_
24400 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20  HANDLE_VALUE) ? 
24410 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
24420 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56  );..  if( h==INV
24430 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
24440 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  E ){.    pFile->
24450 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
24460 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
24470 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
24480 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c  NTOPEN, pFile->l
24490 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70  astErrno, "winOp
244a0 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b  en", zUtf8Name);
244b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
244c0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
244d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
244e0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
244f0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26  f( isReadWrite &
24500 26 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29  & !isExclusive )
24510 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  {.      return w
24520 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61  inOpen(pVfs, zNa
24530 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20  me, id, .       
24540 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45    ((flags|SQLITE
24550 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20  _OPEN_READONLY) 
24560 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
24570 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f         ~(SQLITE_
24580 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
24590 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
245a0 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f  E)),.         pO
245b0 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65  utFlags);.    }e
245c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
245d0 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
245e0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
245f0 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  }..  if( pOutFla
24600 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  gs ){.    if( is
24610 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
24620 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
24630 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24640 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
24650 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
24660 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
24670 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
24680 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
24690 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20  ("OPEN file=%p, 
246a0 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d  name=%s, access=
246b0 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  %lx, pOutFlags=%
246c0 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64  p, *pOutFlags=%d
246d0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
246e0 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74  rc=%s\n", h, zUt
246f0 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65  f8Name, dwDesire
24700 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61  dAccess, pOutFla
24710 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a  gs, pOutFlags ?.
24720 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74             *pOut
24730 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49  Flags : 0, (h==I
24740 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
24750 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
24760 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53  : "ok"));..#if S
24770 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
24780 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
24790 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   && eType==SQLIT
247a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20  E_OPEN_MAIN_DB. 
247b0 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77        && (rc = w
247c0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a  inceCreateLock(z
247d0 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53  Name, pFile))!=S
247e0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20  QLITE_OK.  ){.  
247f0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
24800 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
24810 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
24820 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
24830 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
24840 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24850 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73  -CE-LOCK name=%s
24860 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d  , rc=%s\n", zNam
24870 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
24880 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74  e(rc)));.    ret
24890 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
248a0 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
248b0 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
248c0 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
248d0 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
248e0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
248f0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
24900 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ed);.  }..  sqli
24910 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
24920 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  e);.  pFile->pMe
24930 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
24940 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56  hod;.  pFile->pV
24950 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69  fs = pVfs;.  pFi
24960 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28  le->h = h;.  if(
24970 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20   isReadonly ){. 
24980 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
24990 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52  ags |= WINFILE_R
249a0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
249b0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
249c0 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f  lean(zName, "pso
249d0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
249e0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
249f0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
24a00 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
24a10 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70  LE_PSOW;.  }.  p
24a20 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
24a30 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
24a40 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61  ile->zPath = zNa
24a50 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  me;.#if SQLITE_M
24a60 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
24a70 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
24a80 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  ULL;.  pFile->pM
24a90 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
24aa0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
24ab0 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
24ac0 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
24ad0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
24ae0 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
24af0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
24b00 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  map;.#endif..  O
24b10 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
24b20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24b30 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
24b40 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
24b50 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e  ** Note that Win
24b60 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
24b70 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
24b80 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
24b90 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
24ba0 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
24bb0 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
24bc0 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
24bd0 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
24be0 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
24bf0 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
24c00 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
24c10 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
24c20 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
24c30 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
24c40 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
24c50 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
24c60 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
24c70 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
24c80 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
24c90 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
24ca0 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
24cb0 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
24cc0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
24cd0 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
24ce0 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
24cf0 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
24d00 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
24d10 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
24d20 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
24d30 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
24d40 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
24d50 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
24d60 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
24d70 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
24d80 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
24d90 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
24da0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
24db0 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
24dc0 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
24dd0 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
24de0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
24df0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
24e00 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
24e10 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
24e20 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74  t rc;.  DWORD at
24e30 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  tr;.  DWORD last
24e40 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
24e50 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
24e60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
24e70 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
24e80 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
24e90 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
24ea0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
24eb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
24ec0 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ETE);.  OSTRACE(
24ed0 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
24ee0 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c  , syncDir=%d\n",
24ef0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63   zFilename, sync
24f00 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Dir));..  zConve
24f10 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
24f20 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
24f30 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
24f40 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
24f50 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
24f60 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
24f70 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
24f80 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
24f90 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
24fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
24fb0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
24fc0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
24fd0 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49     do {.#if SQLI
24fe0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
24ff0 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
25000 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
25010 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d  rData;.      mem
25020 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
25030 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
25040 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20  ata));.      if 
25050 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  ( osGetFileAttri
25060 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72  butesExW(zConver
25070 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e  ted, GetFileExIn
25080 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
250b0 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20  AttrData) ){.   
250c0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
250d0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
250e0 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65  ibutes;.      }e
250f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  lse{.        las
25100 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
25110 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
25120 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
25130 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
25140 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
25150 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
25160 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
25170 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
25180 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
25190 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
251a0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
251b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
251c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
251d0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
251e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
251f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
25200 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74  .#else.      att
25210 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
25220 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72  ributesW(zConver
25230 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ted);.#endif.   
25240 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e     if ( attr==IN
25250 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
25260 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20  BUTES ){.       
25270 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
25280 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
25290 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
252a0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
252b0 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
252c0 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
252d0 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
252e0 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
252f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25300 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
25310 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
25320 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
25330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
25350 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
25360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25370 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
25380 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
25390 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b  UTE_DIRECTORY ){
253a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
253b0 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46  LITE_ERROR; /* F
253c0 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  iles only. */.  
253d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
253e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
253f0 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43  osDeleteFileW(zC
25400 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
25410 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25420 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20  _OK; /* Deleted 
25430 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  OK. */.        b
25440 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25450 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74      if ( !winRet
25460 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
25470 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
25480 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25490 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f  _ERROR; /* No mo
254a0 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20  re retries. */. 
254b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
254c0 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c      }.    } whil
254d0 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  e(1);.  }.#ifdef
254e0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
254f0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
25500 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74     do {.      at
25510 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
25520 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65  tributesA(zConve
25530 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20  rted);.      if 
25540 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f  ( attr==INVALID_
25550 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
25560 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
25570 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
25580 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
25590 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
255a0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
255b0 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
255c0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
255d0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
255e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
255f0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
25600 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
25610 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
25620 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
25630 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25640 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25660 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25670 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46       if ( attr&F
25680 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
25690 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20  RECTORY ){.     
256a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
256b0 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f  RROR; /* Files o
256c0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nly. */.        
256d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
256e0 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65       if ( osDele
256f0 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
25700 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ed) ){.        r
25710 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
25720 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f  * Deleted OK. */
25730 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25750 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72   ( !winRetryIoer
25760 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
25770 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
25780 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25790 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
257a0 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
257b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
257c0 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
257d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
257e0 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54   rc && rc!=SQLIT
257f0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
25800 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  OENT ){.    rc =
25810 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
25820 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
25830 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
25840 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e  nDelete", zFilen
25850 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
25860 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63     winLogIoerr(c
25870 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nt);.  }.  sqlit
25880 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25890 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ed);.  OSTRACE((
258a0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
258b0 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65   rc=%s\n", zFile
258c0 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72  name, sqlite3Err
258d0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
258e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
258f0 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73  * Check the exis
25900 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73  tence and status
25910 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73   of a file..*/.s
25920 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63  tatic int winAcc
25930 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
25940 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
25950 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
25960 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
25970 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
25980 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
25990 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  f file to check 
259a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259c0 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20  /* Type of test 
259d0 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20  to make on this 
259e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  file */.  int *p
259f0 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20  ResOut          
25a00 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73       /* OUT: Res
25a10 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52  ult */.){.  DWOR
25a20 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63  D attr;.  int rc
25a30 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61   = 0;.  DWORD la
25a40 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76  stErrno = 0;.  v
25a50 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
25a60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25a70 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69  TER(pVfs);..  Si
25a80 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
25a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25aa0 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20  RR_ACCESS; );.  
25ab0 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
25ac0 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d   name=%s, flags=
25ad0 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e  %x, pResOut=%p\n
25ae0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46  ",.           zF
25af0 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  ilename, flags, 
25b00 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43  pResOut));..  zC
25b10 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
25b20 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
25b30 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
25b40 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
25b50 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
25b60 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61  RACE(("ACCESS na
25b70 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
25b80 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
25b90 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
25ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25bb0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
25bc0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
25bd0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
25be0 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49   0;.    WIN32_FI
25bf0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54  LE_ATTRIBUTE_DAT
25c00 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20  A sAttrData;.   
25c10 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
25c20 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
25c30 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77  ttrData));.    w
25c40 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47  hile( !(rc = osG
25c50 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
25c60 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  ExW((LPCWSTR)zCo
25c70 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c90 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49        GetFileExI
25ca0 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20  nfoStandard, .  
25cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cc0 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
25cd0 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65  rData)) && winRe
25ce0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
25cf0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
25d00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
25d10 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
25d20 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
25d30 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
25d40 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
25d50 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
25d60 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
25d70 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
25d80 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
25d90 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
25da0 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
25db0 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
25dc0 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20  leSizeHigh==0 . 
25dd0 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
25de0 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
25df0 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
25e00 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
25e10 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
25e20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25e30 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
25e40 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
25e50 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
25e60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25e70 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
25e80 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  t);.      if( la
25e90 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46  stErrno!=ERROR_F
25ea0 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26  ILE_NOT_FOUND &&
25eb0 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
25ec0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
25ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
25ee0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
25ef0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
25f00 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
25f10 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
25f20 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  CESS, lastErrno,
25f30 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20   "winAccess",.  
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f50 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
25f60 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
25f70 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
25f80 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
25f90 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
25fa0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
25fb0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
25fc0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
25fd0 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
25fe0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
25ff0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
26000 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
26010 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26020 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
26030 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
26040 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
26050 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
26060 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
26070 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
26080 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
26090 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
260a0 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
260b0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
260c0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
260d0 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TE:.      rc = a
260e0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
260f0 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74               (at
26110 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
26120 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  UTE_READONLY)==0
26130 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
26140 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
26150 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
26160 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
26170 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
26180 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
26190 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
261a0 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%s, pResOut=%p
261b0 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
261c0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
261d0 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
261e0 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a  name, pResOut, *
261f0 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
26200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
26210 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
26220 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
26230 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
26240 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
26250 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a  a drive letter.*
26260 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  * followed by a 
26270 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e  colon character.
26280 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
26290 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
262a0 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73  AndColon(.  cons
262b0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
262c0 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20  e.){.  return ( 
262d0 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
262e0 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20  Pathname[0]) && 
262f0 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a  zPathname[1]==':
26300 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ' );.}../*.** Re
26310 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
26320 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
26330 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
26340 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69   be used verbati
26350 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65  m.  If.** non-ze
26360 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  ro is returned f
26370 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
26380 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  n, the calling f
26390 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d  unction must sim
263a0 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70  ply.** use the p
263b0 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d  rovided path nam
263c0 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20  e verbatim -OR- 
263d0 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20  resolve it into 
263e0 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  a full path name
263f0 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65  .** using the Ge
26400 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69  tFullPathName Wi
26410 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  n32 API function
26420 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e   (if available).
26430 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
26440 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
26450 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  hname(.  const c
26460 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
26470 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  {.  /*.  ** If t
26480 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
26490 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61  rts with a forwa
264a0 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61  rd slash or a ba
264b0 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65  ckslash, it is e
264c0 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67  ither.  ** a leg
264d0 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76  al UNC name, a v
264e0 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70  olume relative p
264f0 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c  ath, or an absol
26500 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e  ute path name in
26510 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22   the.  ** "Unix"
26520 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f   format on Windo
26530 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ws.  There is no
26540 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66   easy way to dif
26550 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
26560 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  en.  ** the fina
26570 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65  l two cases; the
26580 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72  refore, we retur
26590 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75  n the safer retu
265a0 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45  rn value of TRUE
265b0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61  .  ** so that ca
265c0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
265d0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70  nction will simp
265e0 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74  ly use it verbat
265f0 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  im..  */.  if ( 
26600 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74  winIsDirSep(zPat
26610 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  hname[0]) ){.   
26620 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
26630 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
26640 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
26650 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74  arts with a lett
26660 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69  er and a colon i
26670 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f  t is either a vo
26680 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69  lume.  ** relati
26690 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62  ve path or an ab
266a0 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61  solute path.  Ca
266b0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
266c0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a  nction must not.
266d0 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    ** attempt to 
266e0 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65  treat it as a re
266f0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
26700 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75   (i.e. they shou
26710 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20  ld simply use.  
26720 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e  ** it verbatim).
26730 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e  .  */.  if ( win
26740 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
26750 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29  Colon(zPathname)
26760 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26770 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
26780 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   ** If we get to
26790 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
267a0 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
267b0 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  d almost certain
267c0 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20  ly be a purely. 
267d0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65   ** relative one
267e0 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43   (i.e. not a UNC
267f0 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c   name, not absol
26800 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c  ute, and not vol
26810 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20  ume relative).. 
26820 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c   */.  return FAL
26830 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  SE;.}../*.** Tur
26840 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
26850 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
26860 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
26870 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
26880 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
26890 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
268a0 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
268b0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
268c0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
268d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
268e0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
268f0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
26900 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
26910 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
26920 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
26930 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
26940 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
26950 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
26960 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
26970 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26990 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
269a0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
269b0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
269c0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
269d0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
269e0 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69  ffer */.){.  .#i
269f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
26a00 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
26a10 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
26a20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
26a30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26a40 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73  ER(nFull);.  ass
26a50 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73  ert( nFull>=pVfs
26a60 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
26a70 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
26a80 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
26a90 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
26aa0 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
26ab0 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
26ac0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
26ad0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
26ae0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
26af0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
26b00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
26b10 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
26b20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
26b30 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
26b40 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
26b50 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
26b60 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
26b70 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
26b80 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
26b90 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
26ba0 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
26bb0 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73  irectory and a s
26bc0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
26bd0 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
26be0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
26bf0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
26c00 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  e+1 );.    if( !
26c10 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65  zOut ){.      re
26c20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26c30 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
26c40 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
26c50 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
26c60 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f       (osIsNT() ?
26c70 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
26c80 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
26c90 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20  TO_WIN_A) |.    
26ca0 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41          CCP_RELA
26cb0 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c  TIVE, zRelative,
26cc0 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50   zOut, pVfs->mxP
26cd0 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a  athname+1)<0 ){.
26ce0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
26cf0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
26d00 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
26d10 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
26d20 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  EN_CONVPATH, (DW
26d30 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
26d60 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
26d70 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
26d80 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
26d90 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
26da0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74  tf8Filename(zOut
26db0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55  );.      if( !zU
26dc0 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tf8 ){.        s
26dd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
26de0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
26df0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
26e00 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
26e10 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
26e20 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
26e30 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
26e40 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
26e50 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
26e60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26e70 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
26e80 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
26e90 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ), zUtf8);.     
26ea0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
26eb0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
26ec0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
26ed0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
26ee0 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
26ef0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26f00 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
26f10 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
26f20 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
26f30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26f40 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
26f50 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
26f60 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
26f70 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
26f80 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
26f90 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
26fa0 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20  X_TO_WIN_A),.   
26fb0 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69           zRelati
26fc0 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e  ve, zOut, pVfs->
26fd0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
26fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26ff0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
27000 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
27010 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
27020 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
27030 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
27040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27050 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
27060 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
27070 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tive);.    }else
27080 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
27090 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
270a0 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
270b0 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
270c0 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
270d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
270e0 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
270f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
27100 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  R_NOMEM;.      }
27110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
27120 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
27130 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
27140 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
27150 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
27160 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
27170 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
27180 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
27190 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
271a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
271b0 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54  ndif..#if (SQLIT
271c0 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
271d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26  LITE_OS_WINRT) &
271e0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
271f0 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
27200 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
27210 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
27220 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20  .  /* WinCE has 
27230 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20  no concept of a 
27240 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
27250 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f  e, or so I am to
27260 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52  ld. */.  /* WinR
27270 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20  T has no way to 
27280 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69  convert a relati
27290 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62  ve path to an ab
272a0 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20  solute one. */. 
272b0 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
272c0 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
272d0 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
272e0 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
272f0 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
27300 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
27310 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
27320 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
27330 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
27340 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
27350 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
27360 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
27370 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
27380 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
27390 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
273a0 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
273b0 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
273c0 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
273d0 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
273e0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
273f0 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
27400 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
27410 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
27420 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
27430 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
27440 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
27450 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
27460 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27470 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
27480 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
27490 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
274a0 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
274b0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
274c0 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
274d0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
274e0 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  "%s", zRelative)
274f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
27500 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
27510 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
27520 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
27530 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
27540 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
27550 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65  _).  DWORD nByte
27560 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
27570 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f  rted;.  char *zO
27580 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ut;..  /* If thi
27590 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69  s path name begi
275a0 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77  ns with "/X:", w
275b0 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20  here "X" is any 
275c0 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20  alphabetic.  ** 
275d0 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61  character, disca
275e0 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22  rd the initial "
275f0 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68  /" from the path
27600 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
27610 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
27620 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65  /' && winIsDrive
27630 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
27640 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20  Relative+1) ){. 
27650 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
27660 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f    }..  /* It's o
27670 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
27680 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
27690 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
276a0 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
276b0 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
276c0 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
276d0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
276e0 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
276f0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
27700 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
27710 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
27720 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
27730 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
27740 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
27750 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
27760 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
27770 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
27780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
27790 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ROR );.  if ( sq
277a0 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
277b0 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
277c0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
277d0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
277e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
277f0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
27800 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
27810 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
27820 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
27830 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
27840 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
27850 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
27860 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
27870 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
27880 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
27890 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
278a0 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
278b0 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
278c0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
278d0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
278e0 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
278f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
27900 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
27910 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
27920 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
27930 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27950 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
27960 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
27970 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69  irSep(), zRelati
27980 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ve);.    return 
27990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
279a0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
279b0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
279c0 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Filename(zRelati
279d0 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ve);.  if( zConv
279e0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
279f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
27a00 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
27a10 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
27a20 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
27a30 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
27a40 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
27a50 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
27a60 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
27a70 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
27a80 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27a90 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
27aa0 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
27ab0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
27ac0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
27ad0 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
27ae0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
27af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b00 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
27b10 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame1", zRelative
27b20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  );.    }.    nBy
27b30 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
27b40 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
27b50 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
27b60 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
27b70 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
27b80 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27b90 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
27ba0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
27bb0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27bc0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
27bd0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
27be0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
27bf0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
27c00 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
27c10 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
27c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
27c30 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
27c40 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
27c50 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
27c60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
27c70 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
27c80 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
27c90 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
27ca0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
27cd0 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  2", zRelative);.
27ce0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
27cf0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
27d00 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77  d);.    zOut = w
27d10 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
27d20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
27d30 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
27d40 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
27d50 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
27d60 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
27d70 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  ar *zTemp;.    n
27d80 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
27d90 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
27da0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
27db0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
27dc0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
27dd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
27de0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
27df0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
27e00 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
27e10 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73  PEN_FULLPATH, os
27e20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
27e50 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65  lPathname3", zRe
27e60 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20  lative);.    }. 
27e70 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
27e80 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
27e90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
27ea0 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
27eb0 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
27ec0 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
27ed0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27ee0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
27ef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27f00 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
27f10 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
27f20 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
27f30 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
27f40 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
27f50 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
27f60 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
27f70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
27f80 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
27f90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
27fa0 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
27fb0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
27fc0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
27fd0 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
27fe0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28010 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76  name4", zRelativ
28020 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
28030 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28040 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
28050 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
28060 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
28070 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
28080 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
28090 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
280a0 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
280b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
280c0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
280d0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
280e0 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
280f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28100 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  zOut);.    retur
28110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28120 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
28130 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
28140 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  MEM;.  }.#endif.
28150 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
28160 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
28170 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
28180 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
28190 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
281a0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
281b0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
281c0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
281d0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
281e0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
281f0 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  ibrary..*/./*.**
28200 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
28210 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
28220 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
28230 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
28240 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
28250 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
28260 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
28270 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
28280 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
28290 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
282a0 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
282b0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
282c0 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
282d0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
282e0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
282f0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
28300 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
28310 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
28320 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  s);.  if( zConve
28330 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
28340 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
28350 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
28360 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
28370 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  RT.    h = osLoa
28380 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
28390 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
283a0 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a  rted, 0);.#else.
283b0 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
283c0 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29  braryW((LPCWSTR)
283d0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
283e0 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
283f0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
28400 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
28410 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61   h = osLoadLibra
28420 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  ryA((char*)zConv
28430 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
28440 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
28450 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28460 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
28470 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
28480 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
28490 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
284a0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
284b0 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
284c0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
284d0 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72  ;.  winGetLastEr
284e0 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
284f0 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
28500 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69  BufOut);.}.stati
28510 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79  c void (*winDlSy
28520 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
28530 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e  Vfs,void *pH,con
28540 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28  st char *zSym))(
28550 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  void){.  UNUSED_
28560 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
28570 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28  .  return (void(
28580 2a 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72  *)(void))osGetPr
28590 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44  ocAddressA((HAND
285a0 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a  LE)pH, zSym);.}.
285b0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
285c0 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
285d0 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
285e0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
285f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
28600 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72  s);.  osFreeLibr
28610 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
28620 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
28630 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
28640 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
28650 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
28660 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
28670 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
28680 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
28690 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
286a0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
286b0 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
286c0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75  .../*.** Write u
286d0 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20  p to nBuf bytes 
286e0 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e  of randomness in
286f0 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  to zBuf..*/.stat
28700 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d  ic int winRandom
28710 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
28720 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
28730 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
28740 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e   int n = 0;.  UN
28750 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
28760 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  Vfs);.#if define
28770 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20  d(SQLITE_TEST). 
28780 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d   n = nBuf;.  mem
28790 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
287a0 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
287b0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d  sizeof(SYSTEMTIM
287c0 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  E)<=nBuf-n ){.  
287d0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
287e0 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
287f0 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d  ime(&x);.    mem
28800 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78  cpy(&zBuf[n], &x
28810 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
28820 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29    n += sizeof(x)
28830 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65  ;.  }.  if( size
28840 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
28850 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70  n ){.    DWORD p
28860 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e  id = osGetCurren
28870 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20  tProcessId();.  
28880 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
28890 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28  ], &pid, sizeof(
288a0 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  pid));.    n += 
288b0 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d  sizeof(pid);.  }
288c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
288d0 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f  INRT.  if( sizeo
288e0 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42  f(ULONGLONG)<=nB
288f0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e  uf-n ){.    ULON
28900 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65  GLONG cnt = osGe
28910 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a  tTickCount64();.
28920 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
28930 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f  [n], &cnt, sizeo
28940 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b  f(cnt));.    n +
28950 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20  = sizeof(cnt);. 
28960 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73   }.#else.  if( s
28970 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
28980 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
28990 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  D cnt = osGetTic
289a0 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65  kCount();.    me
289b0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
289c0 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
289d0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
289e0 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  of(cnt);.  }.#en
289f0 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  dif.  if( sizeof
28a00 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c  (LARGE_INTEGER)<
28a10 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c  =nBuf-n ){.    L
28a20 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a  ARGE_INTEGER i;.
28a30 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f      osQueryPerfo
28a40 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69  rmanceCounter(&i
28a50 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
28a60 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65  Buf[n], &i, size
28a70 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  of(i));.    n +=
28a80 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a   sizeof(i);.  }.
28a90 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
28aa0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  n;.}.../*.** Sle
28ab0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
28ac0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
28ad0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
28ae0 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74  e slept..*/.stat
28af0 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28  ic int winSleep(
28b00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
28b10 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29  s, int microsec)
28b20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  {.  sqlite3_win3
28b30 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65  2_sleep((microse
28b40 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  c+999)/1000);.  
28b50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28b60 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
28b70 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29   ((microsec+999)
28b80 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a  /1000)*1000;.}..
28b90 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
28ba0 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66  ing variable, if
28bb0 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65   set to a non-ze
28bc0 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74  ro value, is int
28bd0 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74  erpreted as.** t
28be0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  he number of sec
28bf0 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20  onds since 1970 
28c00 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73  and is used to s
28c10 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
28c20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72  .** sqlite3OsCur
28c30 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e  rentTime() durin
28c40 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69  g testing..*/.#i
28c50 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
28c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72  .int sqlite3_cur
28c70 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20  rent_time = 0;  
28c80 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74  /* Fake system t
28c90 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73  ime in seconds s
28ca0 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65  ince 1970. */.#e
28cb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ndif../*.** Find
28cc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
28cd0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
28ce0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
28cf0 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
28d00 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72  piNow.** the cur
28d10 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
28d20 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
28d30 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20  ay number times 
28d40 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a  86_400_000.  In.
28d50 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  ** other words, 
28d60 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  write into *piNo
28d70 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  w the number of 
28d80 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e  milliseconds sin
28d90 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a  ce the Julian.**
28da0 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69   epoch of noon i
28db0 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e  n Greenwich on N
28dc0 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34  ovember 24, 4714
28dd0 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74   B.C according t
28de0 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74  o the.** prolept
28df0 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c  ic Gregorian cal
28e00 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  endar..**.** On 
28e10 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20  success, return 
28e20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75  SQLITE_OK.  Retu
28e30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
28e40 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
28e50 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  date .** cannot 
28e60 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
28e70 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
28e80 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
28e90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
28ea0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
28eb0 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
28ec0 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
28ed0 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
28ee0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
28ef0 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20   number of .    
28f00 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
28f10 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
28f20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
28f30 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
28f40 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49  . .  */.  FILETI
28f50 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20  ME ft;.  static 
28f60 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e  const sqlite3_in
28f70 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  t64 winFiletimeE
28f80 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a  poch = 23058135*
28f90 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
28fa0 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53  640000;.#ifdef S
28fb0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61  QLITE_TEST.  sta
28fc0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
28fd0 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63  3_int64 unixEpoc
28fe0 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71  h = 24405875*(sq
28ff0 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
29000 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  000;.#endif.  /*
29010 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64   2^32 - to avoid
29020 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77   use of LL and w
29030 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a  arnings in gcc *
29040 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
29050 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
29060 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a  ax32BitValue = .
29070 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
29080 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
29090 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
290a0 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20  )2000000000 +.  
290b0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
290c0 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
290d0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
290e0 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
290f0 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
29100 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
29110 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
29120 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
29130 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
29140 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
29150 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
29160 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
29170 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
29180 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
29190 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
291a0 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
291b0 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
291c0 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
291d0 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
291e0 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
291f0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
29200 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
29210 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
29220 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
29230 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
29240 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54  64)ft.dwLowDateT
29250 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e  ime)/(sqlite3_in
29260 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64  t64)10000;..#ifd
29270 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
29280 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
29290 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
292a0 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
292b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
292c0 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
292d0 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
292e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
292f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29300 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  fs);.  return SQ
29310 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
29320 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
29330 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
29340 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
29350 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
29360 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
29370 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
29380 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
29390 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
293a0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
293b0 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
293c0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
293d0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
293e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
293f0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
29400 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29410 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
29420 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
29430 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
29440 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54  rc = winCurrentT
29450 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
29460 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b  i);.  if( !rc ){
29470 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  .    *prNow = i/
29480 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a  86400000.0;.  }.
29490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
294a0 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
294b0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
294c0 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
294d0 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
294e0 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
294f0 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
29500 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77  sage() on Window
29510 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
29520 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
29530 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20  on Unix). After 
29540 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
29550 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
29560 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
29570 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
29580 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
29590 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
295a0 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
295b0 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
295c0 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
295d0 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
295e0 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
295f0 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
29600 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
29610 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
29620 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
29630 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
29640 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  rred within the 
29650 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61  calling.** threa
29660 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
29670 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
29680 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74   too large for t
29690 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
296a0 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64  er,.** it should
296b0 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54   be truncated. T
296c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
296d0 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  of xGetLastError
296e0 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
296f0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
29700 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
29710 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
29720 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
29730 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
29740 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66  s truncated). If
29750 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
29760 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  urned,.** then i
29770 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
29780 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ry to include th
29790 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
297a0 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
297b0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
297c0 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75  er..**.** Not su
297d0 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72  pplying an error
297e0 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61   message will ha
297f0 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66  ve no adverse ef
29800 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74  fect.** on SQLit
29810 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f  e. It is fine to
29820 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65   have an impleme
29830 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76  ntation that nev
29840 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
29850 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a   error message:.
29860 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74  **.**   int xGet
29870 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
29880 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
29890 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
298a0 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  f){.**     asser
298b0 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29  t(zBuf[0]=='\0')
298c0 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  ;.**     return 
298d0 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  0;.**   }.**.** 
298e0 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72  However if an er
298f0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
29900 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c  upplied, it will
29910 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64   be incorporated
29920 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e  .** by sqlite in
29930 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
29940 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74  sage available t
29950 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67  o the user using
29960 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  .** sqlite3_errm
29970 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d  sg(), possibly m
29980 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20  aking IO errors 
29990 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e  easier to debug.
299a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
299b0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  inGetLastError(s
299c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
299d0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
299e0 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45   *zBuf){.  UNUSE
299f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
29a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47  );.  return winG
29a10 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
29a20 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
29a30 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a   nBuf, zBuf);.}.
29a40 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
29a50 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
29a60 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
29a70 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
29a80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
29a90 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
29aa0 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
29ab0 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
29ac0 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
29ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
29ae0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
29af0 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
29b00 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
29b10 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33  .    SQLITE_WIN3
29b20 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  2_MAX_PATH_BYTES
29b30 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20  , /* mxPathname 
29b40 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
29b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
29b60 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e  Next */.    "win
29b70 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  32",            
29b80 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
29b90 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
29ba0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
29bb0 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
29bc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29bd0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69   xOpen */.    wi
29be0 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  nDelete,        
29bf0 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
29c00 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
29c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
29c20 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46  cess */.    winF
29c30 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
29c40 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
29c50 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
29c60 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
29c70 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
29c80 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  winDlError,     
29c90 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
29ca0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
29cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29cc0 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
29cd0 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
29ce0 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
29cf0 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
29d00 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52  ess,       /* xR
29d10 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20  andomness */.   
29d20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20   winSleep,      
29d30 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
29d40 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
29d50 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78  tTime,      /* x
29d60 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
29d70 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72     winGetLastErr
29d80 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  or,     /* xGetL
29d90 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
29da0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
29db0 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74  t64, /* xCurrent
29dc0 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20  TimeInt64 */.   
29dd0 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c   winSetSystemCal
29de0 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73  l,    /* xSetSys
29df0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
29e00 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inGetSystemCall,
29e10 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
29e20 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
29e30 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
29e40 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
29e50 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66  Call */.  };.#if
29e60 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
29e70 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
29e80 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
29e90 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68  _vfs winLongPath
29ea0 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
29ed0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
29ee0 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
29ef0 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49  File */.    SQLI
29f00 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
29f10 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61  H_BYTES, /* mxPa
29f20 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
29f50 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61     "win32-longpa
29f60 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65  th",    /* zName
29f70 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f90 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
29fa0 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
29fb0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
29fc0 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
29fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
29fe0 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
29ff0 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
2a000 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
2a010 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
2a020 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
2a030 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2a040 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2a050 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
2a060 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
2a070 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
2a080 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
2a090 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
2a0a0 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
2a0b0 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
2a0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2a0d0 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
2a0e0 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
2a0f0 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2a100 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2a110 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2a120 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
2a130 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
2a140 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2a150 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
2a160 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
2a170 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2a180 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2a190 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
2a1a0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2a1b0 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79   */.    winSetSy
2a1c0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
2a1d0 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
2a1e0 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
2a1f0 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47  emCall,    /* xG
2a200 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
2a210 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
2a220 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78  mCall,   /* xNex
2a230 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2a240 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   };.#endif..  /*
2a250 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68   Double-check th
2a260 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b  at the aSyscall[
2a270 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e  ] array has been
2a280 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a   constructed.  *
2a290 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65  * correctly.  Se
2a2a0 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36  e ticket [bb3a86
2a2b0 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a  e890c8e96ab] */.
2a2c0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
2a2d0 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37  ize(aSyscall)==7
2a2e0 36 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d  6 );..  /* get m
2a2f0 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61  emory map alloca
2a300 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79  tion granularity
2a310 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69   */.  memset(&wi
2a320 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  nSysInfo, 0, siz
2a330 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29  eof(SYSTEM_INFO)
2a340 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
2a350 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61  _WINRT.  osGetNa
2a360 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26  tiveSystemInfo(&
2a370 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c  winSysInfo);.#el
2a380 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  se.  osGetSystem
2a390 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
2a3a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
2a3b0 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  rt( winSysInfo.d
2a3c0 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
2a3d0 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73  larity>0 );.  as
2a3e0 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f  sert( winSysInfo
2a3f0 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b  .dwPageSize>0 );
2a400 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ..  sqlite3_vfs_
2a410 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73  register(&winVfs
2a420 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  , 1);..#if defin
2a430 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2a440 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69  HAS_WIDE).  sqli
2a450 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2a460 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73  (&winLongPathVfs
2a470 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  , 0);.#endif..  
2a480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a490 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ; .}..int sqlite
2a4a0 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
2a4b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2a4c0 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70  INRT.  if( sleep
2a4d0 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj!=NULL ){.   
2a4e0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73   osCloseHandle(s
2a4f0 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c  leepObj);.    sl
2a500 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20  eepObj = NULL;. 
2a510 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2a520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2a530 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2a540 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a              E_OS_WIN */.