/ Hex Artifact Content
Login

Artifact cb3f26205ea785a63ea5bdc21a9c9f9ae3972d0f:


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 44 57 4f 52 44 20 64 77 49 6e 69 74 69     DWORD dwIniti
b140: 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  alSize = SQLITE_
b150: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
b160: 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44 20  SIZE;.    DWORD 
b170: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
b180: 28 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47 6c  (DWORD)sqlite3Gl
b190: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
b1a0: 3b 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78 69  ;.    if( dwMaxi
b1b0: 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  mumSize==0 ){.  
b1c0: 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a      dwMaximumSiz
b1d0: 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  e = SQLITE_WIN32
b1e0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a  _HEAP_MAX_SIZE;.
b1f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 77      }else if( dw
b200: 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61  InitialSize>dwMa
b210: 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20  ximumSize ){.   
b220: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
b230: 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65   = dwMaximumSize
b240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
b250: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
b260: 20 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51   osHeapCreate(SQ
b270: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b280: 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 49               dwI
b2b0: 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61  nitialSize, dwMa
b2c0: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
b2d0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
b2e0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20  ->hHeap ){.     
b2f0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b300: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
b310: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
b320: 48 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29  HeapCreate (%lu)
b330: 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74  , flags=%u, init
b340: 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a  Size=%lu, maxSiz
b350: 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20  e=%lu",.        
b360: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
b370: 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (), SQLITE_WIN32
b380: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77 49  _HEAP_FLAGS, dwI
b390: 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20  nitialSize,.    
b3a0: 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53        dwMaximumS
b3b0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
b3c0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
b3d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
b3e0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
b3f0: 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72   TRUE;.    asser
b400: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
b410: 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  bOwned );.  }.#e
b420: 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74  lse.  pWinMemDat
b430: 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74  a->hHeap = osGet
b440: 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20  ProcessHeap();. 
b450: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
b460: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
b470: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b480: 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20  TE_NOMEM,.      
b490: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74    "failed to Get
b4a0: 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75  ProcessHeap (%lu
b4b0: 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  )", osGetLastErr
b4c0: 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72  or());.    retur
b4d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
b4e0: 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74    }.  pWinMemDat
b4f0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53  a->bOwned = FALS
b500: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57  E;.  assert( !pW
b510: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
b520: 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  d );.#endif.  as
b530: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
b540: 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  a->hHeap!=0 );. 
b550: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
b560: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
b570: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
b580: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
b590: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
b5a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b5b0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
b5c0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
b5d0: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
b5e0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
b5f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b600: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
b610: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
b620: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b630: 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69  /*.** Deinitiali
b640: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
b650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
b660: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
b670: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
b680: 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69   winMemData *pWi
b690: 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d  nMemData = (winM
b6a0: 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74  emData *)pAppDat
b6b0: 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  a;..  if( !pWinM
b6c0: 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b  emData ) return;
b6d0: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
b6e0: 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d  emData->magic1==
b6f0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b  WINMEM_MAGIC1 );
b700: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
b710: 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d  emData->magic2==
b720: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b  WINMEM_MAGIC2 );
b730: 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44  ..  if( pWinMemD
b740: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
b750: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
b760: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e  mData->hHeap!=IN
b770: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
b780: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
b790: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
b7a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b7b0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
b7c0: 54 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20  TE).    assert( 
b7d0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
b7e0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
b7f0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b800: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
b810: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ) );.#endif.    
b820: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
b830: 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20  >bOwned ){.     
b840: 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74   if( !osHeapDest
b850: 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  roy(pWinMemData-
b860: 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20  >hHeap) ){.     
b870: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b880: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
b890: 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74  iled to HeapDest
b8a0: 72 6f 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d  roy (%lu), heap=
b8b0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
b8c0: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
b8d0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
b8e0: 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  *)pWinMemData->h
b8f0: 48 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Heap);.      }. 
b900: 20 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61       pWinMemData
b910: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45  ->bOwned = FALSE
b920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
b930: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
b940: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
b950: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65  .** Populate the
b960: 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72   low-level memor
b970: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e  y allocation fun
b980: 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69  ction pointers i
b990: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62  n.** sqlite3Glob
b9a0: 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20  alConfig.m with 
b9b0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20  pointers to the 
b9c0: 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73  routines in this
b9d0: 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72   file. The.** ar
b9e0: 67 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20  guments specify 
b9f0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  the block of mem
ba00: 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a  ory to manage..*
ba10: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ba20: 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
ba30: 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   by sqlite3_conf
ba40: 69 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66  ig(), and theref
ba50: 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65  ore.** is not re
ba60: 71 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72  quired to be thr
ba70: 65 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e  eadsafe (it is n
ba80: 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ot)..*/.const sq
ba90: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
baa0: 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  s *sqlite3MemGet
bab0: 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73  Win32(void){.  s
bac0: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
bad0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
bae0: 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20  winMemMethods = 
baf0: 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c  {.    winMemMall
bb00: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72  oc,.    winMemFr
bb10: 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65  ee,.    winMemRe
bb20: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
bb30: 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mSize,.    winMe
bb40: 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69  mRoundup,.    wi
bb50: 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69  nMemInit,.    wi
bb60: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20  nMemShutdown,.  
bb70: 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a    &win_mem_data.
bb80: 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77    };.  return &w
bb90: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a  inMemMethods;.}.
bba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d  .void sqlite3Mem
bbb0: 53 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29  SetDefault(void)
bbc0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  {.  sqlite3_conf
bbd0: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
bbe0: 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33  _MALLOC, sqlite3
bbf0: 4d 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a  MemGetWin32());.
bc00: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
bc10: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
bc20: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
bc30: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
bc40: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
bc50: 69 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e  icode (UTF-16?).
bc60: 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f   .**.** Space to
bc70: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
bc80: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
bc90: 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
bca0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
bcb0: 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  STR winUtf8ToUni
bcc0: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
bcd0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
bce0: 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53  nt nChar;.  LPWS
bcf0: 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  TR zWideFilename
bd00: 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d  ;..  nChar = osM
bd10: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
bd20: 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  ar(CP_UTF8, 0, z
bd30: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55  Filename, -1, NU
bd40: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
bd50: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
bd60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
bd70: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  ideFilename = sq
bd80: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
bd90: 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a 57   nChar*sizeof(zW
bda0: 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  ideFilename[0]) 
bdb0: 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46 69  );.  if( zWideFi
bdc0: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
bdd0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
bde0: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
bdf0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
be00: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
be10: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46  name, -1, zWideF
be20: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29 3b           nChar);
be50: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
be60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
be70: 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  ree(zWideFilenam
be80: 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69 6c  e);.    zWideFil
be90: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
bea0: 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69 6c   return zWideFil
beb0: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
bec0: 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f 66  Convert Microsof
bed0: 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54 46  t Unicode to UTF
bee0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
bef0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
bf00: 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62 74  string is.** obt
bf10: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
bf20: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
bf30: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
bf40: 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50  UnicodeToUtf8(LP
bf50: 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e  CWSTR zWideFilen
bf60: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ame){.  int nByt
bf70: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  e;.  char *zFile
bf80: 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  name;..  nByte =
bf90: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
bfa0: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
bfb0: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
bfc0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
bfd0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
bfe0: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
bff0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
c000: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
c010: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
c020: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
c030: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
c040: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
c050: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
c060: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
c070: 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  F8, 0, zWideFile
c080: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
c090: 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20  ame, nByte,.    
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
c0c0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
c0d0: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
c0e0: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  e3_free(zFilenam
c0f0: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e);.    zFilenam
c100: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
c110: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  urn zFilename;.}
c120: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
c130: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74  an ANSI string t
c140: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
c150: 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ode, based on th
c160: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64  e.** current cod
c170: 65 70 61 67 65 20 73 65 74 74 69 6e 67 73 20 66  epage settings f
c180: 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a  or file apis..**
c190: 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f   .** Space to ho
c1a0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
c1b0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
c1c0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
c1d0: 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  e3_malloc..*/.st
c1e0: 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d  atic LPWSTR winM
c1f0: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e  bcsToUnicode(con
c200: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
c210: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
c220: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73  ;.  LPWSTR zMbcs
c230: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Filename;.  int 
c240: 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65  codepage = osAre
c250: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
c260: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
c270: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  CP;..  nByte = o
c280: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
c290: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
c2a0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
c2b0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66         0)*sizeof
c2e0: 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e  (WCHAR);.  if( n
c2f0: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Byte==0 ){.    r
c300: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
c310: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73  MbcsFilename = s
c320: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
c330: 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
c340: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  MbcsFilename[0])
c350: 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46   );.  if( zMbcsF
c360: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
c370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c380: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
c390: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
c3a0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
c3b0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63  lename, -1, zMbc
c3c0: 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  sFilename,.     
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
c3f0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
c400: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
c410: 5f 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e  _free(zMbcsFilen
c420: 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46  ame);.    zMbcsF
c430: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
c440: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46  .  return zMbcsF
c450: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
c460: 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73  * Convert Micros
c470: 6f 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d  oft Unicode to m
c480: 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63  ulti-byte charac
c490: 74 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65  ter string, base
c4a0: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72  d on the.** user
c4b0: 27 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65  's ANSI codepage
c4c0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
c4d0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
c4e0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
c4f0: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
c500: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
c510: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c520: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73  winUnicodeToMbcs
c530: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69  (LPCWSTR zWideFi
c540: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
c550: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
c560: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
c570: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
c580: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
c590: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
c5a0: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
c5b0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
c5c0: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
c5d0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
c5e0: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
c5f0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
c600: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c610: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
c620: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
c630: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
c640: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
c650: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c660: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
c670: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
c680: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
c690: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
c6a0: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
c6b0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
c6e0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
c6f0: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
c700: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
c710: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
c720: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
c730: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
c740: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
c750: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
c760: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
c770: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
c780: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
c790: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
c7a0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
c7b0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
c7c0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
c7d0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
c7e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
c7f0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
c800: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
c810: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
c820: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
c830: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
c840: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
c850: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
c860: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c870: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
c880: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
c890: 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65  eToUtf8(zTmpWide
c8a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
c8b0: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
c8c0: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55  eturn zFilenameU
c8d0: 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tf8;.}../*.** Co
c8e0: 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f 20 6d  nvert UTF-8 to m
c8f0: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
c900: 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70 61 63  er string.  Spac
c910: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a  e to hold the .*
c920: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
c930: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
c940: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
c950: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
c960: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
c970: 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63  _to_mbcs(const c
c980: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
c990: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
c9a0: 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52  meMbcs;.  LPWSTR
c9b0: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
c9c0: 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38  mpWide = winUtf8
c9d0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
c9e0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
c9f0: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
ca00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
ca10: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 77  FilenameMbcs = w
ca20: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
ca30: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
ca40: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
ca50: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
ca60: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a  ilenameMbcs;.}..
ca70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
ca80: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74  ion sets the dat
ca90: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74  a directory or t
caa0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
cab0: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a  ectory based on.
cac0: 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ** the provided 
cad0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
cae0: 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75  type argument mu
caf0: 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72  st be 1 in order
cb00: 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64   to set the.** d
cb10: 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72  ata directory or
cb20: 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   2 in order to s
cb30: 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  et the temporary
cb40: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65   directory.  The
cb50: 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d   zValue.** argum
cb60: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
cb70: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
cb80: 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65   to use.  The re
cb90: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20  turn value will 
cba0: 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  be.** SQLITE_OK 
cbb0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
cbc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
cbd0: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
cbe0: 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50  y(DWORD type, LP
cbf0: 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20  CWSTR zValue){. 
cc00: 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74   char **ppDirect
cc10: 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ory = 0;.#ifndef
cc20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
cc30: 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d  OINIT.  int rc =
cc40: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
cc50: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
cc60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
cc70: 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d  dif.  if( type==
cc80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
cc90: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
cca0: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
ccb0: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64  ory = &sqlite3_d
ccc0: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  ata_directory;. 
ccd0: 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d   }else if( type=
cce0: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
ccf0: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
cd00: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
cd10: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
cd20: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
cd30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
cd40: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79  pDirectory || ty
cd50: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
cd60: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
cd70: 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c  TYPE.          |
cd80: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
cd90: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
cda0: 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20  ORY_TYPE.  );.  
cdb0: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
cdc0: 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d  tory || sqlite3M
cdd0: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a  emdebugHasType(*
cde0: 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d  ppDirectory, MEM
cdf0: 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20  TYPE_HEAP) );.  
ce00: 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20  if( ppDirectory 
ce10: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61  ){.    char *zVa
ce20: 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20  lueUtf8 = 0;.   
ce30: 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a   if( zValue && z
ce40: 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20  Value[0] ){.    
ce50: 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 77    zValueUtf8 = w
ce60: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
ce70: 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69  zValue);.      i
ce80: 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d  f ( zValueUtf8==
ce90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
cea0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ceb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ced0: 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a  (*ppDirectory);.
cee0: 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79      *ppDirectory
cef0: 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20   = zValueUtf8;. 
cf00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cf10: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
cf20: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
cf30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74  }../*.** The ret
cf40: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e  urn value of win
cf50: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  GetLastErrorMsg.
cf60: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
cf70: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
cf80: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
cf90: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
cfa0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
cfb0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
cfc0: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
cfd0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
cfe0: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57  tLastErrorMsg(DW
cff0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69  ORD lastErrno, i
d000: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
d010: 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61  Buf){.  /* Forma
d020: 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73  tMessage returns
d030: 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20   0 on failure.  
d040: 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a  Otherwise it.  *
d050: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  * returns the nu
d060: 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77  mber of TCHARs w
d070: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
d080: 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  tput.  ** buffer
d090: 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
d0a0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c  terminating null
d0b0: 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57   char..  */.  DW
d0c0: 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20  ORD dwLen = 0;. 
d0d0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b   char *zOut = 0;
d0e0: 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
d0f0: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
d100: 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41  S_WINRT.    WCHA
d110: 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49  R zTempWide[SQLI
d120: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
d130: 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20  MSG_CHARS+1];.  
d140: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
d150: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
d160: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
d170: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d190: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
d1a0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
d1b0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
d200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d210: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
d240: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
d270: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
d280: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50  0);.#else.    LP
d2b0: 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d  WSTR zTempWide =
d2c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
d2d0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
d2e0: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
d2f0: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
d300: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
d330: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
d360: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
d370: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
d3c0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65     (LPWSTR) &zTe
d410: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a       0);.#endif.
d460: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
d470: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
d480: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
d490: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
d4a0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
d4b0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
d4c0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
d4d0: 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  Out = winUnicode
d4e0: 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65  ToUtf8(zTempWide
d4f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d500: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
d510: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
d520: 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a  S_WINRT.      /*
d530: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
d540: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
d550: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
d560: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
d570: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64  calFree(zTempWid
d580: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
d590: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
d5a0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
d5b0: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
d5c0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
d5d0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
d5e0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
d5f0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
d600: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
d610: 20 20 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 46 4f 52               FOR
d630: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
d640: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
d670: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
d680: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
d6d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
d6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
d710: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &zTemp,.  
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d730: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d750: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
d760: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
d770: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
d780: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
d790: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
d7a0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
d7b0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
d7c0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
d7d0: 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
d7e0: 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
d7f0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71  zTemp);.      sq
d800: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
d810: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a  lloc();.      /*
d820: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
d830: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
d840: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
d850: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
d860: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a  calFree(zTemp);.
d870: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
d880: 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65  .  if( 0 == dwLe
d890: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
d8a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
d8b0: 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30  zBuf, "OsError 0
d8c0: 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73  x%lx (%lu)", las
d8d0: 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e  tErrno, lastErrn
d8e0: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
d8f0: 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d   /* copy a maxim
d900: 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73  um of nBuf chars
d910: 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65   to output buffe
d920: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
d930: 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
d940: 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74  zBuf, "%s", zOut
d950: 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74  );.    /* free t
d960: 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20 2a  he UTF8 buffer *
d970: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  /.    sqlite3_fr
d980: 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20  ee(zOut);.  }.  
d990: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d9a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d9b0: 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f  ion - winLogErro
d9c0: 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f  rAtLine() - is o
d9d0: 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20  nly ever called 
d9e0: 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a  via the macro.**
d9f0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a   winLogError()..
da00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
da10: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66  ne is invoked af
da20: 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ter an error occ
da30: 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e  urs in an OS fun
da40: 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67  ction..** It log
da50: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
da60: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
da70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
da80: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
da90: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
daa0: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
dab0: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
dac0: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
dad0: 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  om .** FormatMes
dae0: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
daf0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
db00: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
db10: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
db20: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
db30: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
db40: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
db50: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
db60: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
db70: 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20  _CANTOPEN). .** 
db80: 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65  The two subseque
db90: 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f  nt arguments sho
dba0: 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20  uld be the name 
dbb0: 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69  of the OS functi
dbc0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65  on that.** faile
dbd0: 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  d and the associ
dbe0: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
dbf0: 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a   path, if any..*
dc00: 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67  /.#define winLog
dc10: 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20  Error(a,b,c,d)  
dc20: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
dc30: 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e  ne(a,b,c,d,__LIN
dc40: 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
dc50: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
dc60: 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65  e(.  int errcode
dc70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dc80: 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65       /* SQLite e
dc90: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44  rror code */.  D
dca0: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dcc0: 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72  * Win32 last err
dcd0: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
dce0: 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20  ar *zFunc,      
dcf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
dd00: 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  of OS function t
dd10: 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  hat failed */.  
dd20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
dd30: 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
dd40: 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73  /* File path ass
dd50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72  ociated with err
dd60: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e  or */.  int iLin
dd70: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
dd80: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
dd90: 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68  e line number wh
dda0: 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ere error occurr
ddb0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ed */.){.  char 
ddc0: 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20  zMsg[500];      
ddd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75             /* Hu
dde0: 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72  man readable err
ddf0: 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  or text */.  int
de00: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de20: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
de30: 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a  .  zMsg[0] = 0;.
de40: 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
de50: 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20  rMsg(lastErrno, 
de60: 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d  sizeof(zMsg), zM
de70: 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  sg);.  assert( e
de80: 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrcode!=SQLITE_O
de90: 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  K );.  if( zPath
dea0: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
deb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73  ;.  for(i=0; zMs
dec0: 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21  g[i] && zMsg[i]!
ded0: 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d  ='\r' && zMsg[i]
dee0: 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\n'; i++){}. 
def0: 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20   zMsg[i] = 0;.  
df00: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63  sqlite3_log(errc
df10: 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77  ode,.      "os_w
df20: 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25  in.c:%d: (%lu) %
df30: 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20  s(%s) - %s",.   
df40: 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72     iLine, lastEr
df50: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
df60: 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20  h, zMsg.  );..  
df70: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
df80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d  }../*.** The num
df90: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
dfa0: 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20  t a ReadFile(), 
dfb0: 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64  WriteFile(), and
dfc0: 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a   DeleteFile().**
dfd0: 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64   will be retried
dfe0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63   following a loc
dff0: 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f  king error - pro
e000: 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 20  bably caused by 
e010: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
e020: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
e030: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
e040: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
e050: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
e060: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
e070: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
e080: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
e090: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
e0a0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
e0b0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
e0c0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
e0d0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
e0e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e0f0: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
e100: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
e110: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
e120: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
e130: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
e140: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
e150: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
e160: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
e170: 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
e180: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
e190: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
e1a0: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66  DELAY;../*.** If
e1b0: 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72   a ReadFile() or
e1c0: 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72   WriteFile() err
e1d0: 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b  or occurs, invok
e1e0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
e1f0: 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73  * to see if it s
e200: 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64  hould be retried
e210: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74  .  Return TRUE t
e220: 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e  o retry.  Return
e230: 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76   FALSE.** to giv
e240: 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72  e up with an err
e250: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
e260: 74 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  t winRetryIoerr(
e270: 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57  int *pnRetry, DW
e280: 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  ORD *pError){.  
e290: 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c  DWORD e = osGetL
e2a0: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66  astError();.  if
e2b0: 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49  ( *pnRetry>=winI
e2c0: 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20  oerrRetry ){.   
e2d0: 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
e2e0: 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65       *pError = e
e2f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
e300: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
e310: 65 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  e==ERROR_ACCESS_
e320: 44 45 4e 49 45 44 20 7c 7c 0a 20 20 20 20 20 20  DENIED ||.      
e330: 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49  e==ERROR_LOCK_VI
e340: 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20 20 20 20 20  OLATION ||.     
e350: 20 65 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e   e==ERROR_SHARIN
e360: 47 5f 56 49 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20  G_VIOLATION ){. 
e370: 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
e380: 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52  _sleep(winIoerrR
e390: 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e  etryDelay*(1+*pn
e3a0: 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a  Retry));.    ++*
e3b0: 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74  pnRetry;.    ret
e3c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
e3d0: 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a   pError ){.    *
e3e0: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a  pError = e;.  }.
e3f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
e400: 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65  *.** Log a I/O e
e410: 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f  rror retry episo
e420: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
e430: 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69  id winLogIoerr(i
e440: 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 66  nt nRetry){.  if
e450: 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20  ( nRetry ){.    
e460: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
e470: 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20 20 20 20  TE_IOERR, .     
e480: 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66   "delayed %dms f
e490: 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20  or lock/sharing 
e4a0: 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20  conflict",.     
e4b0: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
e4c0: 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74  lay*nRetry*(nRet
e4d0: 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20  ry+1)/2.    );. 
e4e0: 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45   }.}..#if SQLITE
e4f0: 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a  _OS_WINCE./*****
e500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e540: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63  ****.** This sec
e550: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f  tion contains co
e560: 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c  de for WinCE onl
e570: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
e580: 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  ed(SQLITE_MSVC_L
e590: 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c  OCALTIME_API) ||
e5a0: 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f   !SQLITE_MSVC_LO
e5b0: 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a  CALTIME_API./*.*
e5c0: 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f  * The MSVC CRT o
e5d0: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79  n Windows CE may
e5e0: 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61   not have a loca
e5f0: 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  ltime() function
e600: 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20  .  So.** create 
e610: 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f  a substitute..*/
e620: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
e630: 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f  h>.struct tm *__
e640: 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28  cdecl localtime(
e650: 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29  const time_t *t)
e660: 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  .{.  static stru
e670: 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54  ct tm y;.  FILET
e680: 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20  IME uTm, lTm;.  
e690: 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a  SYSTEMTIME pTm;.
e6a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
e6b0: 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b  t64;.  t64 = *t;
e6c0: 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20  .  t64 = (t64 + 
e6d0: 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30  11644473600)*100
e6e0: 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c  00000;.  uTm.dwL
e6f0: 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57  owDateTime = (DW
e700: 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46  ORD)(t64 & 0xFFF
e710: 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77  FFFFF);.  uTm.dw
e720: 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44  HighDateTime= (D
e730: 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29  WORD)(t64 >> 32)
e740: 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
e750: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75  LocalFileTime(&u
e760: 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69  Tm,&lTm);.  osFi
e770: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
e780: 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20  me(&lTm,&pTm);. 
e790: 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d   y.tm_year = pTm
e7a0: 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20  .wYear - 1900;. 
e7b0: 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e   y.tm_mon = pTm.
e7c0: 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e  wMonth - 1;.  y.
e7d0: 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_wday = pTm.wD
e7e0: 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d  ayOfWeek;.  y.tm
e7f0: 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _mday = pTm.wDay
e800: 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20  ;.  y.tm_hour = 
e810: 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74  pTm.wHour;.  y.t
e820: 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e  m_min = pTm.wMin
e830: 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20  ute;.  y.tm_sec 
e840: 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20  = pTm.wSecond;. 
e850: 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65   return &y;.}.#e
e860: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41  ndif..#define HA
e870: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
e880: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
e890: 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f  char*)a)[-(int)o
e8a0: 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c  ffsetof(winFile,
e8b0: 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  h)]../*.** Acqui
e8c0: 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  re a lock on the
e8d0: 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61   handle h.*/.sta
e8e0: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75  tic void winceMu
e8f0: 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c  texAcquire(HANDL
e900: 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64  E h){.   DWORD d
e910: 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20  wErr;.   do {.  
e920: 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69     dwErr = osWai
e930: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
e940: 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20  (h, INFINITE);. 
e950: 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72    } while (dwErr
e960: 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f   != WAIT_OBJECT_
e970: 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41  0 && dwErr != WA
e980: 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d  IT_ABANDONED);.}
e990: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
e9a0: 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62   lock acquired b
e9b0: 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  y winceMutexAcqu
e9c0: 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ire().*/.#define
e9d0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
e9e0: 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74  se(h) ReleaseMut
e9f0: 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ex(h)../*.** Cre
ea00: 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ate the mutex an
ea10: 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  d shared memory 
ea20: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
ea30: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
ea40: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
ea50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ea60: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63  inceCreateLock(c
ea70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
ea80: 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70  name, winFile *p
ea90: 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20  File){.  LPWSTR 
eaa0: 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a  zTok;.  LPWSTR z
eab0: 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61  Name;.  DWORD la
eac0: 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20  stErrno;.  BOOL 
ead0: 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b  bLogged = FALSE;
eae0: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
eaf0: 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d  TRUE;..  zName =
eb00: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
eb10: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
eb20: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
eb30: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
eb40: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
eb50: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
eb60: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
eb70: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
eb80: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
eb90: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
eba0: 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
ebb0: 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
ebc0: 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
ebd0: 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
ebe0: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
ebf0: 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
ec00: 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
ec10: 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
ec20: 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
ec30: 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
ec40: 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
ec50: 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
ec60: 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
ec70: 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
ec80: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
ec90: 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
eca0: 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
ecb0: 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
ecc0: 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
ecd0: 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
ece0: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
ecf0: 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
ed00: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
ed10: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
ed20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
ed30: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
ed40: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
ed50: 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
ed60: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
ed90: 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
eda0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  e);.  }..  /* Ac
edb0: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
edc0: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
edd0: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
ede0: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
edf0: 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a  hMutex);.  .  /*
ee00: 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
ee10: 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
ee20: 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
ee30: 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
ee40: 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d   are .  ** case-
ee50: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
ee60: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
ee70: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
ee80: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
ee90: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
eea0: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
eeb0: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
eec0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61  me..  */.  osCha
eed0: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
eee0: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
eef0: 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
ef00: 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f  appingW(INVALID_
ef10: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55  HANDLE_VALUE, NU
ef20: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
ef50: 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73  _READWRITE, 0, s
ef60: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
ef70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29            zName)
efa0: 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20  ;  ..  /* Set a 
efb0: 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
efc0: 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69  tes we're the fi
efd0: 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68  rst to create th
efe0: 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a  e memory so it .
eff0: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72    ** must be zer
f000: 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  o-initialized */
f010: 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  .  lastErrno = o
f020: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
f030: 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e 6f  .  if (lastErrno
f040: 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41 44   == ERROR_ALREAD
f050: 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20 62  Y_EXISTS){.    b
f060: 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20  Init = FALSE;.  
f070: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  }..  sqlite3_fre
f080: 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  e(zName);..  /* 
f090: 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  If we succeeded 
f0a0: 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73 68  in making the sh
f0b0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
f0c0: 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20  le, map it. */. 
f0d0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61   if( pFile->hSha
f0e0: 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  red ){.    pFile
f0f0: 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e 63  ->shared = (winc
f100: 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77  eLock*)osMapView
f110: 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53  OfFile(pFile->hS
f120: 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20 20 20  hared, .        
f130: 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45       FILE_MAP_RE
f140: 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  AD|FILE_MAP_WRIT
f150: 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  E, 0, 0, sizeof(
f160: 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20  winceLock));.   
f170: 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66   /* If mapping f
f180: 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65  ailed, close the
f190: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
f1a0: 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20  andle and erase 
f1b0: 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  it */.    if( !p
f1c0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a  File->shared ){.
f1d0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
f1e0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
f1f0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
f200: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f210: 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
f220: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
f240: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32  winceCreateLock2
f250: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
f260: 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
f270: 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  RUE;.      osClo
f280: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
f290: 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
f2a0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
f2b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
f2c0: 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
f2d0: 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
f2e0: 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
f2f0: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
f300: 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
f310: 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61   if( pFile->hSha
f320: 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  red==NULL ){.   
f330: 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b   if( !bLogged ){
f340: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
f350: 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
f360: 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  rno;.      winLo
f370: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
f380: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
f390: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
f3a0: 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
f3b0: 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69  reateLock3", zFi
f3c0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
f3d0: 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
f3e0: 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75     }.    winceMu
f3f0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
f400: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
f410: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
f420: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
f430: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
f440: 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
f450: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
f460: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74    }.  .  /* Init
f470: 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65  ialize the share
f480: 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72  d memory if we'r
f490: 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f  e supposed to */
f4a0: 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a  .  if( bInit ){.
f4b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65      memset(pFile
f4c0: 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a  ->shared, 0, siz
f4d0: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
f4e0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
f4f0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
f500: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
f510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f520: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74  ./*.** Destroy t
f530: 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69  he part of winFi
f540: 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69  le that deals wi
f550: 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a  th wince locks.*
f560: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
f570: 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77  nceDestroyLock(w
f580: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
f590: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75    if (pFile->hMu
f5a0: 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71  tex){.    /* Acq
f5b0: 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a  uire the mutex *
f5c0: 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
f5d0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
f5e0: 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20  Mutex);..    /* 
f5f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f600: 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62  ocks should prob
f610: 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64  ably assert in d
f620: 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74  ebug mode, but t
f630: 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74  hey.       are t
f640: 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73  o cleanup in cas
f650: 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61  e any locks rema
f660: 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20  ined open */.   
f670: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
f680: 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20  l.nReaders){.   
f690: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
f6a0: 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
f6b0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
f6c0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
f6d0: 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ved){.      pFil
f6e0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
f6f0: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
f700: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
f710: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
f720: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
f730: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
f740: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  g = FALSE;.    }
f750: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
f760: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
f770: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
f780: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
f790: 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
f7a0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66  }..    /* De-ref
f7b0: 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65  erence and close
f7c0: 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65   our copy of the
f7d0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
f7e0: 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55  andle */.    osU
f7f0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
f800: 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20  File->shared);. 
f810: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
f820: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
f830: 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77  ;..    /* Done w
f840: 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ith the mutex */
f850: 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52  .    winceMutexR
f860: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
f870: 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20 20 6f  utex);    .    o
f880: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
f890: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
f8a0: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
f8b0: 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
f8c0: 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e   .** An implemen
f8d0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f  tation of the Lo
f8e0: 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20  ckFile() API of 
f8f0: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
f900: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
f910: 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c  nceLockFile(.  L
f920: 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a  PHANDLE phFile,.
f930: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
f940: 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
f950: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67   dwFileOffsetHig
f960: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  h,.  DWORD nNumb
f970: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
f980: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
f990: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
f9a0: 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  High.){.  winFil
f9b0: 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c  e *pFile = HANDL
f9c0: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46  E_TO_WINFILE(phF
f9d0: 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65  ile);.  BOOL bRe
f9e0: 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20  turn = FALSE;.. 
f9f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fa00: 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69  R(dwFileOffsetHi
fa10: 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gh);.  UNUSED_PA
fa20: 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f  RAMETER(nNumberO
fa30: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
fa40: 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  );..  if (!pFile
fa50: 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
fa60: 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
fa70: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
fa80: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
fa90: 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c   Wanting an excl
faa0: 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
fab0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
fac0: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
fad0: 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20  HARED_FIRST.    
fae0: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
faf0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
fb00: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
fb10: 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46  IZE){.    if (pF
fb20: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
fb30: 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46  aders == 0 && pF
fb40: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
fb50: 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20  clusive == 0){. 
fb60: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
fb70: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
fb80: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70  = TRUE;.       p
fb90: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
fba0: 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20  lusive = TRUE;. 
fbb0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
fbc0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
fbd0: 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61  .  /* Want a rea
fbe0: 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a  d-only lock? */.
fbf0: 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
fc00: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
fc10: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
fc20: 54 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  T &&.           
fc30: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
fc40: 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  LockLow == 1){. 
fc50: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
fc60: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
fc70: 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46   == 0){.      pF
fc80: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
fc90: 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66  ers ++;.      if
fca0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
fcb0: 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20  Readers == 1){. 
fcc0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
fcd0: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b  ared->nReaders +
fce0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
fcf0: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
fd00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fd10: 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20   Want a pending 
fd20: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
fd30: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
fd40: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
fd50: 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20  NDING_BYTE.     
fd60: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
fd70: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
fd80: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49   == 1){.    /* I
fd90: 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63  f no pending loc
fda0: 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69  k has been acqui
fdb0: 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72  red, then acquir
fdc0: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  e it */.    if (
fdd0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
fde0: 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a  Pending == 0) {.
fdf0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
fe00: 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
fe10: 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
fe20: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
fe30: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
fe40: 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
fe50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fe60: 57 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20  Want a reserved 
fe70: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
fe80: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
fe90: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
fea0: 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20  SERVED_BYTE.    
feb0: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
fec0: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
fed0: 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
fee0: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
fef0: 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20  bReserved == 0) 
ff00: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
ff10: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
ff20: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70   = TRUE;.      p
ff30: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
ff40: 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  erved = TRUE;.  
ff50: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
ff60: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
ff70: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
ff80: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
ff90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
ffa0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  urn;.}../*.** An
ffb0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
ffc0: 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c  of the UnlockFil
ffd0: 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  e API of Windows
ffe0: 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
fff0: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f  c BOOL winceUnlo
10000 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
10010 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
10020 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  RD dwFileOffsetL
10030 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  ow,.  DWORD dwFi
10040 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  leOffsetHigh,.  
10050 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
10060 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c  ytesToUnlockLow,
10070 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
10080 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
10090 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
100a0 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
100b0 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
100c0 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
100d0 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
100e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
100f0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
10100 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
10110 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
10120 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
10130 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c  h);..  if (!pFil
10140 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72  e->hMutex) retur
10150 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d  n TRUE;.  winceM
10160 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
10170 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f  e->hMutex);..  /
10180 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
10190 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20  ader lock or an 
101a0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
101b0 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
101c0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
101d0 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b  D)SHARED_FIRST){
101e0 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68  .    /* Did we h
101f0 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
10200 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66   lock? */.    if
10210 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
10220 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
10230 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
10240 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
10250 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
10260 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  RED_SIZE);.     
10270 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
10280 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
10290 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
102a0 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
102b0 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
102c0 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
102d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
102e0 69 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  id we just have 
102f0 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a  a reader lock? *
10300 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70  /.    else if (p
10310 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
10320 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73  ders){.      ass
10330 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ert(nNumberOfByt
10340 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
10350 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53   (DWORD)SHARED_S
10360 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  IZE.            
10370 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   || nNumberOfByt
10380 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
10390 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65   1);.      pFile
103a0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
103b0 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70   --;.      if (p
103c0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
103d0 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20  ders == 0).     
103e0 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65   {.        pFile
103f0 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
10400 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  rs --;.      }. 
10410 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
10420 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
10430 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
10440 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f   pending lock */
10450 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
10460 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
10470 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
10480 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  TE.           &&
10490 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
104a0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
104b0 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
104c0 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
104d0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
104e0 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
104f0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
10500 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
10510 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
10520 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
10530 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  UE;.    }.  }.  
10540 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72  /* Releasing a r
10550 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a  eserved lock */.
10560 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
10570 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
10580 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59  WORD)RESERVED_BY
10590 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  TE.           &&
105a0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
105b0 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
105c0 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
105d0 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
105e0 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
105f0 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
10600 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
10610 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10620 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
10630 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
10640 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
10650 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
10660 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
10670 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
10680 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a  bReturn;.}./*.**
10690 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63   End of the spec
106a0 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e  ial code for win
106b0 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ce.*************
106c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
106f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10700 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  /.#endif /* SQLI
10710 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a  TE_OS_WINCE */..
10720 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c  /*.** Lock a fil
10730 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  e region..*/.sta
10740 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b  tic BOOL winLock
10750 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
10760 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
10770 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20   flags,.  DWORD 
10780 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
10790 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
107a0 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
107b0 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
107c0 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
107d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
107e0 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
107f0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
10800 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
10810 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
10820 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
10830 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
10840 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  LockFile..  */. 
10850 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63   return winceLoc
10860 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66  kFile(phFile, of
10870 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
10880 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  igh,.           
10890 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
108a0 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
108b0 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
108c0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
108d0 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
108e0 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
108f0 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
10900 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
10910 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
10920 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
10930 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
10940 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
10950 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
10960 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66  ileEx(*phFile, f
10970 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65  lags, 0, numByte
10980 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
10990 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
109a0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
109b0 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  osLockFile(*phFi
109c0 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
109d0 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
109e0 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
10a00 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
10a10 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
10a20 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72   Unlock a file r
10a30 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69  egion.. */.stati
10a40 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b  c BOOL winUnlock
10a50 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
10a60 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
10a70 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
10a80 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
10a90 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
10aa0 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
10ab0 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66  BytesHigh.){.#if
10ac0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10ad0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
10ae0 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
10af0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
10b00 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
10b10 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
10b20 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49  2.  **       API
10b30 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a   UnlockFile..  *
10b40 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
10b50 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  UnlockFile(phFil
10b60 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
10b70 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
10b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b90 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20     numBytesLow, 
10ba0 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23  numBytesHigh);.#
10bb0 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e  else.  if( osIsN
10bc0 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c  T() ){.    OVERL
10bd0 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20  APPED ovlp;.    
10be0 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c  memset(&ovlp, 0,
10bf0 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
10c00 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ED));.    ovlp.O
10c10 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f  ffset = offsetLo
10c20 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  w;.    ovlp.Offs
10c30 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48  etHigh = offsetH
10c40 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  igh;.    return 
10c50 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a  osUnlockFileEx(*
10c60 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79  phFile, 0, numBy
10c70 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
10c80 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
10c90 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
10ca0 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a  n osUnlockFile(*
10cb0 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
10cc0 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e  w, offsetHigh, n
10cd0 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20  umBytesLow,.    
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
10d00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
10d10 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
10d60 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  ** The next grou
10d70 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d  p of routines im
10d80 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20  plement the I/O 
10d90 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65  methods specifie
10da0 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69  d.** by the sqli
10db0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
10dc0 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bject..*********
10dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  *****/../*.** So
10e20 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d  me Microsoft com
10e30 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73  pilers lack this
10e40 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a   definition..*/.
10e50 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f  #ifndef INVALID_
10e60 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
10e70 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
10e80 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
10e90 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23  ER ((DWORD)-1).#
10ea0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
10eb0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  e the current po
10ec0 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  sition of the fi
10ed0 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  le handle passed
10ee0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
10ef0 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66  * argument to of
10f00 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74  fset iOffset wit
10f10 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66  hin the file. If
10f20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
10f30 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72  urn 0. .** Other
10f40 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
10f50 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
10f60 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
10f70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
10f80 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c  nSeekFile(winFil
10f90 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
10fa0 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
10fb0 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
10fc0 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
10fd0 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
10fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
10ff0 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
11000 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
11010 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11030 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
11040 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
11050 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
11060 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
11070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
11080 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
11090 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
110a0 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
110b0 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
110c0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
110d0 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
110e0 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f  tError() */..  O
110f0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
11100 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
11110 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
11120 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75   iOffset));..  u
11130 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
11140 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
11150 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
11160 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
11170 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
11180 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
11190 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
111a0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
111b0 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
111c0 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20  urns a dword .  
111d0 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
111e0 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20  e lower 32-bits 
111f0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d  of the new file-
11200 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69  offset. Or, if i
11210 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74  t fails,.  ** it
11220 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44   returns INVALID
11230 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
11240 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72  R. However accor
11250 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20  ding to MSDN, . 
11260 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f   ** INVALID_SET_
11270 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79  FILE_POINTER may
11280 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64   also be a valid
11290 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20   new offset. So 
112a0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
112b0 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72  ** whether an er
112c0 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ror has actually
112d0 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73   occurred, it is
112e0 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20   also necessary 
112f0 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65  to call .  ** Ge
11300 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20  tLastError()..  
11310 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53  */.  dwRet = osS
11320 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46  etFilePointer(pF
11330 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  ile->h, lowerBit
11340 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
11350 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
11360 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c  f( (dwRet==INVAL
11370 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
11380 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c  TER.      && ((l
11390 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
113a0 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
113b0 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20  _ERROR)) ){.    
113c0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
113d0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
113e0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
113f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
11400 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11410 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11420 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22     "winSeekFile"
11430 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
11440 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
11450 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
11460 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
11470 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
11480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
11490 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
114a0 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
114b0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
114c0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
114d0 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
114e0 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20  /*.  ** Same as 
114f0 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
11500 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  at this implemen
11510 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72  tation works for
11520 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20   WinRT..  */..  
11530 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b  LARGE_INTEGER x;
11540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11550 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65  /* The new offse
11560 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74  t */.  BOOL bRet
11570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11580 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
11590 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
115a0 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a  ilePointerEx() *
115b0 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20  /..  x.QuadPart 
115c0 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65  = iOffset;.  bRe
115d0 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  t = osSetFilePoi
115e0 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c  nterEx(pFile->h,
115f0 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49   x, 0, FILE_BEGI
11600 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29  N);..  if(!bRet)
11610 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
11620 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11630 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
11640 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11650 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
11660 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
11690 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
116a0 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
116b0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
116c0 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
116d0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
116e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
116f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
11700 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
11710 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
11720 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
11730 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  n 0;.#endif.}..#
11740 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
11750 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72  AP_SIZE>0./* For
11760 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
11770 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
11780 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 6d  thods used for m
11790 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c  emory mapped fil
117a0 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es */.static int
117b0 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46   winMapfile(winF
117c0 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
117d0 74 36 34 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  t64);.static int
117e0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69   winUnmapfile(wi
117f0 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a  nFile*);.#endif.
11800 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
11810 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ile..**.** It is
11820 20 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61   reported that a
11830 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f  n attempt to clo
11840 73 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68  se a handle migh
11850 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66  t sometimes.** f
11860 61 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20  ail.  This is a 
11870 76 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c  very unreasonabl
11880 65 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69  e result, but Wi
11890 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f  ndows is notorio
118a0 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20  us.** for being 
118b0 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20  unreasonable so 
118c0 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74  I do not doubt t
118d0 68 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70  hat it might hap
118e0 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  pen.  If.** the 
118f0 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20  close fails, we 
11900 70 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69  pause for 100 mi
11910 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
11920 72 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a  ry again.  As.**
11930 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53   many as MX_CLOS
11940 45 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70  E_ATTEMPT attemp
11950 74 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  ts to close the 
11960 68 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20  handle are made 
11970 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67  before.** giving
11980 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
11990 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23  g an error..*/.#
119a0 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f  define MX_CLOSE_
119b0 41 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63  ATTEMPT 3.static
119c0 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71   int winClose(sq
119d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
119e0 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d  .  int rc, cnt =
119f0 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   0;.  winFile *p
11a00 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
11a10 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )id;..  assert( 
11a20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66  id!=0 );.#ifndef
11a30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11a40 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
11a50 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e  ->pShm==0 );.#en
11a60 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 46  dif.  assert( pF
11a70 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20  ile->h!=NULL && 
11a80 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49  pFile->h!=INVALI
11a90 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
11aa0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  ;.  OSTRACE(("CL
11ab0 4f 53 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20  OSE file=%p\n", 
11ac0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66  pFile->h));..#if
11ad0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
11ae0 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e 6d  _SIZE>0.  winUnm
11af0 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23  apfile(pFile);.#
11b00 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20 20  endif..  do{.   
11b10 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e   rc = osCloseHan
11b20 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
11b30 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f     /* SimulateIO
11b40 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74  Error( rc=0; cnt
11b50 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50  =MX_CLOSE_ATTEMP
11b60 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c  T; ); */.  }whil
11b70 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
11b80 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
11b90 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33  EMPT && (sqlite3
11ba0 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
11bb0 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c  ), 1) );.#if SQL
11bc0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65  ITE_OS_WINCE.#de
11bd0 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54  fine WINCE_DELET
11be0 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20  ION_ATTEMPTS 3. 
11bf0 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
11c00 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  k(pFile);.  if( 
11c10 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
11c20 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74  Close ){.    int
11c30 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
11c40 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ile(.           
11c50 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46  osDeleteFileW(pF
11c60 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
11c70 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ose)==0.        
11c80 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  && osGetFileAttr
11c90 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a  ibutesW(pFile->z
11ca0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d  DeleteOnClose)!=
11cb0 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20  0xffffffff .    
11cc0 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
11cd0 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
11ce0 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
11cf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
11d00 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20  32_sleep(100);  
11d10 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
11d20 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
11d30 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
11d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11d50 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
11d60 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lose);.  }.#endi
11d70 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  f.  if( rc ){.  
11d80 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
11d90 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
11da0 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52  nter(-1);.  OSTR
11db0 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
11dc0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
11dd0 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f  File->h, rc ? "o
11de0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
11df0 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
11e00 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
11e10 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
11e20 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
11e30 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
11e40 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
11e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e60 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
11e70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
11e80 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
11e90 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
11ea0 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
11eb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11ec0 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
11ed0 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
11ee0 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
11ef0 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
11f00 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
11f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
11f20 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
11f30 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
11f40 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
11f50 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
11f60 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
11f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
11f80 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
11f90 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
11fa0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11fc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
11fd0 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
11fe0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
11ff0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
12000 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
12010 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  offset */.){.#if
12020 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
12030 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  E.  OVERLAPPED o
12040 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
12050 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
12060 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20  t for ReadFile. 
12070 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  */.#endif.  winF
12080 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
12090 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
120a0 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
120b0 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
120c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
120e0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
120f0 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
12100 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
12110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12120 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
12130 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
12140 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
12150 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
12160 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
12170 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
12180 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
12190 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29  LITE_IOERR_READ)
121a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
121b0 41 44 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  AD file=%p, buff
121c0 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
121d0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c  , offset=%lld, l
121e0 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
121f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
12200 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
12210 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
12220 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
12230 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12240 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
12250 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
12260 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
12270 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
12280 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
12290 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
122a0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
122b0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
122c0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
122d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
122e0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
122f0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
12300 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
12310 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
12320 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
12330 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
12340 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
12350 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50  RACE(("READ-MMAP
12360 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
12370 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
12380 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
12390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
123a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123b0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
123c0 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
123d0 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
123e0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
123f0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
12400 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
12410 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  set], nCopy);.  
12420 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
12430 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
12440 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
12450 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
12460 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
12470 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
12480 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12490 45 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  E.  if( winSeekF
124a0 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
124b0 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  t) ){.    OSTRAC
124c0 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
124d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
124e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
124f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12500 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
12510 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
12520 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
12530 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
12540 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
12550 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
12560 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
12570 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
12580 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
12590 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
125a0 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
125b0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
125c0 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
125d0 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
125e0 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
125f0 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
12600 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
12610 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
12620 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
12630 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
12640 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
12650 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
12660 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
12670 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69  rrno;.    if( wi
12680 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
12690 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
126a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
126b0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
126c0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
126d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
126e0 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
126f0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c  LITE_IOERR_READ\
12700 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
12710 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
12720 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
12730 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d  ERR_READ, pFile-
12740 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
12750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12760 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
12770 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
12780 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e  .  winLogIoerr(n
12790 52 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52  Retry);.  if( nR
127a0 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
127b0 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
127c0 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
127d0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
127e0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
127f0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
12800 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
12810 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
12820 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66  OSTRACE(("READ f
12830 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
12840 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
12850 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  AD\n", pFile->h)
12860 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12870 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
12880 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _READ;.  }..  OS
12890 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
128a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
128b0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
128c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
128d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
128e0 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
128f0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
12900 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
12910 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
12920 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
12930 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
12940 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
12950 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
12960 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
12970 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
12980 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
12990 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20  write into */.  
129a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
129b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
129c0 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20  /* The bytes to 
129d0 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
129e0 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
12a10 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
12a20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
12a30 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
12a40 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
12a50 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69  the file to begi
12a60 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
12a70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
12a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
12aa0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
12ab0 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
12ac0 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
12ad0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
12ae0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
12af0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
12b00 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
12b10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12b20 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
12b30 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
12b40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
12b50 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
12b60 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
12b70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
12b80 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  TE);.  SimulateD
12b90 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
12ba0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
12bb0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  ;..  OSTRACE(("W
12bc0 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 62 75  RITE file=%p, bu
12bd0 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
12be0 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %d, offset=%lld,
12bf0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
12c00 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
12c10 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
12c20 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
12c30 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
12c40 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
12c50 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
12c60 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
12c70 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
12c80 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
12c90 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
12ca0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
12cb0 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
12cc0 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
12cd0 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
12ce0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
12cf0 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
12d00 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
12d10 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
12d20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
12d30 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
12d40 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
12d50 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
12d60 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 2d  OSTRACE(("WRITE-
12d70 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72 63  MMAP file=%p, rc
12d80 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
12d90 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
12da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12db0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
12dc0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
12dd0 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
12de0 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
12df0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
12e00 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
12e10 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
12e20 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
12e30 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
12e40 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
12e50 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
12e60 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
12e70 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
12e80 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
12e90 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
12ea0 57 49 4e 43 45 0a 20 20 72 63 20 3d 20 77 69 6e  WINCE.  rc = win
12eb0 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
12ec0 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
12ed0 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20  c==0 ){.#else.  
12ee0 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  {.#endif.#if !SQ
12ef0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12f00 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
12f10 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
12f20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
12f30 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a  r WriteFile. */.
12f40 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61  #endif.    u8 *a
12f50 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66  Rem = (u8 *)pBuf
12f60 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
12f70 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
12f80 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  en */.    int nR
12f90 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20  em = amt;       
12fa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12fb0 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74  r of bytes yet t
12fc0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
12fd0 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65      DWORD nWrite
12fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12ff0 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74    /* Bytes writt
13000 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65  en by each Write
13010 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20  File() call */. 
13020 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
13030 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20  no = NO_ERROR;  
13040 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
13050 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
13060 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51  or() */..#if !SQ
13070 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13080 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
13090 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
130a0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
130b0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
130c0 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
130d0 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
130e0 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
130f0 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
13100 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
13110 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
13120 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68  ;.#endif..    wh
13130 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23  ile( nRem>0 ){.#
13140 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
13150 43 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  CE.      if( !os
13160 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
13170 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
13180 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23  &nWrite, 0) ){.#
13190 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21  else.      if( !
131a0 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
131b0 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
131c0 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72  , &nWrite, &over
131d0 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69  lapped) ){.#endi
131e0 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  f.        if( wi
131f0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
13200 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
13210 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
13220 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13230 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
13240 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
13250 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52  Write<=(DWORD)nR
13260 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  em );.      if( 
13270 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
13280 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20  ite>(DWORD)nRem 
13290 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
132a0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
132b0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
132c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
132d0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
132e0 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73 65  INCE.      offse
132f0 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
13300 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
13310 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
13320 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
13330 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  f);.      overla
13340 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
13350 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
13360 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
13370 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ff);.#endif.    
13380 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65    aRem += nWrite
13390 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
133a0 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20  nWrite;.    }.  
133b0 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a    if( nRem>0 ){.
133c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
133d0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
133e0 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  no;.      rc = 1
133f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
13400 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
13410 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74     ( pFile->last
13420 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e  Errno==ERROR_HAN
13430 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a  DLE_DISK_FULL ).
13440 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c         || ( pFil
13450 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
13460 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29  ROR_DISK_FULL ))
13470 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
13480 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c  ("WRITE file=%p,
13490 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c   rc=SQLITE_FULL\
134a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
134b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
134c0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
134d0 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  FULL, pFile->las
134e0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46   "winWrite1", pF
13510 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
13520 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28   }.    OSTRACE((
13530 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20  "WRITE file=%p, 
13540 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
13550 57 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d  WRITE\n", pFile-
13560 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13570 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
13580 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c  ITE_IOERR_WRITE,
13590 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
135a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
135b0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72            "winWr
135c0 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ite2", pFile->zP
135d0 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ath);.  }else{. 
135e0 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e     winLogIoerr(n
135f0 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f 53  Retry);.  }.  OS
13600 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69  TRACE(("WRITE fi
13610 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
13620 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
13630 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
13640 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13650 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
13660 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
13670 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
13680 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e  atic int winTrun
13690 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
136a0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
136b0 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77  nt64 nByte){.  w
136c0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
136d0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
136e0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62  * File handle ob
136f0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
13700 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
13720 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69  urn code for thi
13730 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
13740 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
13750 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
13760 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
13770 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
13780 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
13790 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ATE);.  OSTRACE(
137a0 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d  ("TRUNCATE file=
137b0 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c  %p, size=%lld, l
137c0 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
137d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
137e0 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f  nByte, pFile->lo
137f0 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
13800 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
13810 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
13820 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
13830 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
13840 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
13850 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
13860 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
13870 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
13880 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
13890 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
138a0 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
138b0 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
138c0 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
138d0 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
138e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
138f0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
13900 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
13910 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
13920 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
13930 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
13940 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
13950 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46  ..  /* SetEndOfF
13960 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f  ile() returns no
13970 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63  n-zero when succ
13980 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20  essful, or zero 
13990 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a  when it fails. *
139a0 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  /.  if( winSeekF
139b0 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
139c0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  ) ){.    rc = wi
139d0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
139e0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
139f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13a00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13a10 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
13a20 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
13a30 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
13a40 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
13a50 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26  File(pFile->h) &
13a60 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  &.            ((
13a70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
13a80 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
13a90 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44  RROR_USER_MAPPED
13aa0 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46  _FILE) ){.    pF
13ab0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13ac0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13ad0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
13ae0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
13af0 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
13b00 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
13b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13b20 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70  winTruncate2", p
13b30 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13b40 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
13b50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
13b60 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
13b70 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
13b80 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
13b90 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
13ba0 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65  y.  ** mapped re
13bb0 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
13bc0 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
13bd0 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
13be0 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a   SQLite will.  *
13bf0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
13c00 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
13c10 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
13c20 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
13c30 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ow on..  */.  if
13c40 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
13c50 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69  ion && nByte<pFi
13c60 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
13c70 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
13c80 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ize = nByte;.  }
13c90 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
13ca0 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66 69  CE(("TRUNCATE fi
13cb0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
13cc0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
13cd0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
13ce0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13cf0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
13d00 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  EST./*.** Count 
13d10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75  the number of fu
13d20 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d  llsyncs and norm
13d30 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20  al syncs.  This 
13d40 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a  is used to test.
13d50 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e  ** that syncs an
13d60 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20  d fullsyncs are 
13d70 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65 20  occuring at the 
13d80 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
13d90 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
13da0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
13db0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
13dc0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
13dd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  if../*.** Make s
13de0 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
13df0 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
13e00 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
13e10 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  d to disk..*/.st
13e20 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63  atic int winSync
13e30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13e40 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23  d, int flags){.#
13e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
13e60 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20  _SYNC.  /*.  ** 
13e70 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53  Used only when S
13e80 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73  QLITE_NO_SYNC is
13e90 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20   not defined..  
13ea0 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23   */.  BOOL rc;.#
13eb0 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
13ec0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64  ed(NDEBUG) || !d
13ed0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
13ee0 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20  _SYNC) || \.    
13ef0 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  (defined(SQLITE_
13f00 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65 64  TEST) && defined
13f10 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29 0a  (SQLITE_DEBUG)).
13f20 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77    /*.  ** Used w
13f30 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
13f40 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
13f50 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73  d and by the ass
13f60 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a  ert() and/or.  *
13f70 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72  * OSTRACE() macr
13f80 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46  os..   */.  winF
13f90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
13fa0 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65  nFile*)id;.#else
13fb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13fc0 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a  TER(id);.#endif.
13fd0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
13fe0 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   );.  /* Check t
13ff0 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
14000 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
14010 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
14020 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
14030 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
14040 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
14050 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
14060 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
14070 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
14080 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
14090 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
140a0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
140b0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
140c0 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
140d0 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
140e0 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
140f0 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
14100 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
14110 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
14120 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14130 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54  E_FULL );..  OST
14140 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65  RACE(("SYNC file
14150 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c  =%p, flags=%x, l
14160 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
14170 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
14180 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c 6f  flags, pFile->lo
14190 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64  cktype));..#ifnd
141a0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
141b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
141c0 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a  R(flags);.#else.
141d0 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30    if( (flags&0x0
141e0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
141f0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  FULL ){.    sqli
14200 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
14210 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  nt++;.  }.  sqli
14220 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
14230 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
14240 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
14250 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
14260 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
14270 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
14280 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
14290 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
142a0 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28 22  YNC.  OSTRACE(("
142b0 53 59 4e 43 2d 4e 4f 50 20 66 69 6c 65 3d 25 70  SYNC-NOP file=%p
142c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
142d0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
142e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
142f0 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  K;.#else.  rc = 
14300 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
14310 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  rs(pFile->h);.  
14320 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14330 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69   rc=FALSE );.  i
14340 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54  f( rc ){.    OST
14350 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c 65  RACE(("SYNC file
14360 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
14370 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
14380 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14390 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
143a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
143b0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
143c0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53  tError();.    OS
143d0 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
143e0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
143f0 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 20  IOERR_FSYNC\n", 
14400 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
14410 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
14420 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14430 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSYNC, pFile->la
14440 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65  "winSync", pFile
14470 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
14480 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
14490 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
144a0 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
144b0 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
144c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
144d0 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
144e0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
144f0 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
14500 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
14510 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
14520 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14530 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
14540 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
14550 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a  rt( pSize!=0 );.
14560 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14570 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
14580 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20  IOERR_FSTAT);.  
14590 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
145a0 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
145b0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
145c0 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  Size));..#if SQL
145d0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
145e0 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41  .    FILE_STANDA
145f0 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20  RD_INFO info;.  
14600 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49    if( osGetFileI
14610 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
14620 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46  leEx(pFile->h, F
14630 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c  ileStandardInfo,
14640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a        &info, siz
14670 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20  eof(info)) ){.  
14680 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66      *pSize = inf
14690 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64  o.EndOfFile.Quad
146a0 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Part;.    }else{
146b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
146c0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
146d0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
146e0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
146f0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14700 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
14710 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
14740 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
14750 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
14760 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65  {.    DWORD uppe
14770 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
14780 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
14790 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
147a0 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20  ..    lowerBits 
147b0 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28  = osGetFileSize(
147c0 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
147d0 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a  Bits);.    *pSiz
147e0 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
147f0 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
14800 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
14810 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77  ;.    if(   (low
14820 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
14830 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
14840 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
14850 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
14860 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
14870 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
14880 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
14890 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
148a0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
148b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
148c0 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
148d0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
148f0 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
14900 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
14910 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
14920 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
14930 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20  e=%p, pSize=%p, 
14940 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d  *pSize=%lld, rc=
14950 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
14960 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a    pFile->h, pSiz
14970 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74  e, *pSize, sqlit
14980 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
14990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
149a0 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
149b0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
149c0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
149d0 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
149e0 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
149f0 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
14a00 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
14a10 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
14a20 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
14a30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
14a40 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
14a50 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IVE_LOCK.# defin
14a60 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  e LOCKFILE_EXCLU
14a70 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64  SIVE_LOCK 2.#end
14a80 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72  if../*.** Histor
14a90 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68  ically, SQLite h
14aa0 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65  as used both the
14ab0 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f   LockFile and Lo
14ac0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
14ad0 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ns..** When the 
14ae0 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f  LockFile functio
14af0 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77  n was used, it w
14b00 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  as always expect
14b10 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d  ed to fail.** im
14b20 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
14b30 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
14b40 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c  be obtained.  Al
14b50 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78  so, it always ex
14b60 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74  pected to.** obt
14b70 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
14b80 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c   lock.  These fl
14b90 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ags are used wit
14ba0 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  h the LockFileEx
14bb0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64   function.** and
14bc0 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65   reflect those e
14bd0 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65  xpectations; the
14be0 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f  refore, they sho
14bf0 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  uld not be chang
14c00 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
14c10 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
14c20 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
14c30 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
14c40 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f  AGS   (LOCKFILE_
14c50 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
14c60 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   | \.           
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f         LOCKFILE_
14c90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
14ca0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75  #endif../*.** Cu
14cb0 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20  rrently, SQLite 
14cc0 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20  never calls the 
14cd0 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
14ce0 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74  ion without want
14cf0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20  ing the.** call 
14d00 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74  to fail immediat
14d10 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
14d20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
14d30 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
14d40 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
14d50 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
14d60 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
14d70 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c  X_FLAGS (LOCKFIL
14d80 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
14d90 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  LY).#endif../*.*
14da0 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64  * Acquire a read
14db0 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66  er lock..** Diff
14dc0 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e  erent API routin
14dd0 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65  es are called de
14de0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
14df0 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a  er or not this.*
14e00 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69  * is Win9x or Wi
14e10 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nNT..*/.static i
14e20 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  nt winGetReadLoc
14e30 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
14e40 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
14e50 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
14e60 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
14e70 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
14e80 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
14e90 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73  pe));.  if( osIs
14ea0 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
14eb0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
14ec0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
14ed0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
14ee0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
14ef0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
14f00 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
14f10 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50  .    **       AP
14f20 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20  I LockFileEx..  
14f30 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77    */.    res = w
14f40 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46  inceLockFile(&pF
14f50 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
14f60 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  IRST, 0, 1, 0);.
14f70 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20  #else.    res = 
14f80 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
14f90 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
14fa0 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20  CKFILEEX_FLAGS, 
14fb0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
14fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14fd0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
14fe0 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  ZE, 0);.#endif. 
14ff0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
15000 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
15010 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
15020 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lk;.    sqlite3_
15030 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
15040 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
15050 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
15060 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29  ckByte = (short)
15070 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66  ((lk & 0x7ffffff
15080 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
15090 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  - 1));.    res =
150a0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
150b0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
150c0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150e0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
150f0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
15100 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
15110 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
15120 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
15130 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15140 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
15150 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
15160 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
15170 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
15180 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43   */.  }.  OSTRAC
15190 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69  E(("READ-LOCK fi
151a0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
151b0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
151c0 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29  e3ErrName(res)))
151d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
151e0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
151f0 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
15200 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
15210 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
15220 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
15230 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
15240 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
15250 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
15260 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
15270 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
15280 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
15290 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
152a0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
152b0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
152c0 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
152d0 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
152e0 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
152f0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
15300 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
15310 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
15320 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
15330 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
15340 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
15350 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
15360 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
15370 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
15380 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15390 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
153a0 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
153b0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
153c0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
153d0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
153e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
153f0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
15400 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
15420 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  nUnlockReadLock"
15430 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
15440 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
15450 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
15460 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
15470 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
15480 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b  3ErrName(res)));
15490 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
154a0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
154b0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
154c0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
154d0 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
154e0 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
154f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15500 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
15510 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
15520 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
15530 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
15540 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
15550 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
15560 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
15570 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
15580 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
15590 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
155a0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
155b0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
155c0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
155d0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
155e0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
155f0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
15600 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
15610 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
15620 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
15630 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
15640 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
15650 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
15660 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
15670 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
15680 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
15690 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
156a0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
156b0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
156c0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
156d0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
156e0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
156f0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
15700 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15710 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
15720 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
15730 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
15740 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
15750 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
15760 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
15770 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
15780 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b  .  The winUnlock
15790 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72  () routine.** er
157a0 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ases all locks a
157b0 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72  t once and retur
157c0 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c  ns us immediatel
157d0 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  y to locking lev
157e0 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  el 0..** It is n
157f0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  ot possible to l
15800 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
15810 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20   level one step 
15820 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a  at a time.  You.
15830 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69  ** must go strai
15840 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ght to locking l
15850 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  evel 0..*/.stati
15860 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71  c int winLock(sq
15870 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
15880 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
15890 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
158a0 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72  _OK;    /* Retur
158b0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72  n code from subr
158c0 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
158d0 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
158e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
158f0 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20   a Windows lock 
15900 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  call */.  int ne
15910 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20  wLocktype;      
15920 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c   /* Set pFile->l
15930 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20  ocktype to this 
15940 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69  value before exi
15950 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f  ting */.  int go
15960 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
15970 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61  ;/* True if we a
15980 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e  cquired a PENDIN
15990 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65  G lock this time
159a0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
159b0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
159c0 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
159d0 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
159e0 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  R;..  assert( id
159f0 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
15a00 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
15a10 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
15a20 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
15a30 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
15a40 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
15a50 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
15a60 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
15a70 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  ktype));..  /* I
15a80 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
15a90 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
15aa0 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
15ab0 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
15ac0 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
15ad0 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
15ae0 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
15af0 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
15b00 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
15b10 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
15b20 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
15b30 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
15b40 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
15b50 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
15b60 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48  OSTRACE(("LOCK-H
15b70 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ELD file=%p, rc=
15b80 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
15b90 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
15ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15bb0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
15bc0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
15bd0 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
15be0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
15bf0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
15c00 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
15c10 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
15c20 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
15c30 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
15c40 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
15c50 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
15c60 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
15c70 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
15c80 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
15c90 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
15ca0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
15cb0 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
15cc0 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  acquire a PENDIN
15cd0 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61  G lock or.  ** a
15ce0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49   SHARED lock.  I
15cf0 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69  f we are acquiri
15d00 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
15d10 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f  , the acquisitio
15d20 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45  n of.  ** the PE
15d30 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
15d40 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20  is temporary..  
15d50 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  */.  newLocktype
15d60 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
15d70 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69  pe;.  if(   (pFi
15d80 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
15d90 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28  _LOCK).     || (
15da0 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58     (locktype==EX
15db0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
15dc0 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65         && (pFile
15dd0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
15de0 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  RVED_LOCK)).  ){
15df0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33  .    int cnt = 3
15e00 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
15e10 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77  -->0 && (res = w
15e20 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
15e30 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
15e40 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e70 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
15e80 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30  TE, 0, 1, 0))==0
15e90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
15ea0 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20   3 times to get 
15eb0 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  the pending lock
15ec0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65  .  This is neede
15ed0 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20  d to work.      
15ee0 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ** around proble
15ef0 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64  ms caused by ind
15f00 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74  exing and/or ant
15f10 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  i-virus software
15f20 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e   on.      ** Win
15f30 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20  dows systems..  
15f40 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72      ** If you ar
15f50 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64  e using this cod
15f60 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72  e as a model for
15f70 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53   alternative VFS
15f80 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20  es, do not.     
15f90 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65   ** copy this re
15fa0 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69  try logic.  It i
15fb0 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65  s a hack intende
15fc0 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e  d for Windows on
15fd0 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
15fe0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
15ff0 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66  K-PENDING-FAIL f
16000 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64  ile=%p, count=%d
16010 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
16020 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16030 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65  ->h, cnt, sqlite
16040 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b  3ErrName(res)));
16050 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20 29  .      if( cnt )
16060 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
16070 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
16080 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
16090 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28  k = res;.    if(
160a0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c   !res ){.      l
160b0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
160c0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
160d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
160e0 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f  uire a shared lo
160f0 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
16100 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
16110 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
16120 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
16130 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
16140 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
16150 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
16160 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72  File);.    if( r
16170 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
16180 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44  ocktype = SHARED
16190 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
161a0 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
161b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
161c0 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
161d0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
161e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20  RESERVED lock.  
161f0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
16200 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e==RESERVED_LOCK
16210 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
16220 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
16230 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
16240 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
16250 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
16260 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
16270 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
16280 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
16290 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
162a0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
162b0 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52  Locktype = RESER
162c0 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  VED_LOCK;.    }e
162d0 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
162e0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
162f0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
16300 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
16310 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a   a PENDING lock.
16320 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
16330 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
16340 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
16350 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16360 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
16370 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
16380 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
16390 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55  Acquire an EXCLU
163a0 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  SIVE lock.  */. 
163b0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
163c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
163d0 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
163e0 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
163f0 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype>=SHARED_LOCK
16400 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
16410 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
16420 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20  pFile);.    res 
16430 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
16440 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
16450 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
16460 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
16470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16480 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
16490 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
164a0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
164b0 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
164c0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
164d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
164e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
164f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
16500 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
16510 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
16520 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65  ..  /* If we are
16530 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49   holding a PENDI
16540 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67  NG lock that oug
16550 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65  ht to be release
16560 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c  d, then.  ** rel
16570 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a  ease it now..  *
16580 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69  /.  if( gotPendi
16590 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79  ngLock && lockty
165a0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
165b0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
165c0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
165d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
165e0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f   1, 0);.  }..  /
165f0 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61  * Update the sta
16600 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68  te of the lock h
16610 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66  as held in the f
16620 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
16630 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  hen.  ** return 
16640 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16650 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a  result code..  *
16660 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20  /.  if( res ){. 
16670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
16680 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
16690 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
166a0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
166b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
166c0 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  SY;.    OSTRACE(
166d0 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65  ("LOCK-FAIL file
166e0 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20  =%p, wanted=%d, 
166f0 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  got=%d\n",.     
16700 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
16710 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c  , locktype, newL
16720 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20  ocktype));.  }. 
16730 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16740 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
16750 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
16760 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
16770 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
16780 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16790 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
167a0 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
167b0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
167c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
167d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
167e0 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
167f0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
16800 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
16810 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
16820 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
16830 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
16840 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
16850 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a   held, return.**
16860 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72   non-zero, other
16870 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  wise zero..*/.st
16880 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63  atic int winChec
16890 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
168a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
168b0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
168c0 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e 46 69   int rc;.  winFi
168d0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
168e0 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
168f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
16900 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16910 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
16920 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  OCK; );.  OSTRAC
16930 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
16940 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75   file=%p, pResOu
16950 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%p\n", pFile->
16960 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  h, pResOut));.. 
16970 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
16980 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
16990 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
169a0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  D_LOCK ){.    rc
169b0 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43   = 1;.    OSTRAC
169c0 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
169d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20   file=%p, rc=%d 
169e0 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c  (local)\n", pFil
169f0 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65  e->h, rc));.  }e
16a00 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  lse{.    rc = wi
16a10 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
16a20 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
16a30 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53  FILEEX_FLAGS,RES
16a40 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
16a50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
16a60 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c   ){.      winUnl
16a70 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16a80 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
16a90 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
16aa0 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63 3b 0a  }.    rc = !rc;.
16ab0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
16ac0 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
16ad0 25 70 2c 20 72 63 3d 25 64 20 28 72 65 6d 6f 74  %p, rc=%d (remot
16ae0 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
16af0 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52   rc));.  }.  *pR
16b00 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53  esOut = rc;.  OS
16b10 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
16b20 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52  LOCK file=%p, pR
16b30 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
16b40 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
16b50 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
16b60 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65     pFile->h, pRe
16b70 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29  sOut, *pResOut))
16b80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16b90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  E_OK;.}../*.** L
16ba0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
16bb0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
16bc0 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20  escriptor id to 
16bd0 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74  locktype.  lockt
16be0 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ype.** must be e
16bf0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
16c00 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
16c10 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
16c20 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
16c30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16c40 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
16c50 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
16c60 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
16c70 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
16c80 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16c90 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20  **.** It is not 
16ca0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
16cb0 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69  s routine to fai
16cc0 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  l if the second 
16cd0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e  argument.** is N
16ce0 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20  O_LOCK.  If the 
16cf0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
16d00 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74  is SHARED_LOCK t
16d10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
16d20 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e  .** might return
16d30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a   SQLITE_IOERR;.*
16d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
16d50 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
16d60 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
16d70 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79  ktype){.  int ty
16d80 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  pe;.  winFile *p
16d90 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
16da0 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
16db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
16dc0 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
16dd0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
16de0 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype<=SHARED_LOCK
16df0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16e00 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
16e10 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20  oldLock=%d(%d), 
16e20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  newLock=%d\n",. 
16e30 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16e40 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
16e50 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
16e60 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b  edLockByte, lock
16e70 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d  type));.  type =
16e80 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16e90 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58  ;.  if( type>=EX
16ea0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
16eb0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
16ec0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
16ed0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
16ee0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
16ef0 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d     if( locktype=
16f00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
16f10 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28  !winGetReadLock(
16f20 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  pFile) ){.      
16f30 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  /* This should n
16f40 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65  ever happen.  We
16f50 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
16f60 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20  e able to.      
16f70 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65  ** reacquire the
16f80 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
16f90 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
16fa0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
16fb0 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c  R_UNLOCK, osGetL
16fc0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fe0 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
16ff0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
17000 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
17010 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
17020 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
17030 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
17040 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
17050 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
17060 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
17070 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
17080 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
17090 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61      winUnlockRea
170a0 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
170b0 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45  }.  if( type>=PE
170c0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
170d0 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
170e0 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
170f0 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
17100 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
17110 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c  locktype = (u8)l
17120 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41  ocktype;.  OSTRA
17130 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
17140 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63  =%p, lock=%d, rc
17150 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
17160 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
17170 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71  le->locktype, sq
17180 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
17190 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
171a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
171b0 72 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c  rg is inititiall
171c0 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
171d0 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
171e0 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
171f0 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
17200 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
17210 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
17220 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
17230 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
17240 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
17250 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
17260 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
17270 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
17280 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
17290 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69  c void winModeBi
172a0 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  t(winFile *pFile
172b0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
172c0 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
172d0 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
172e0 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
172f0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
17300 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
17310 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
17320 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
17330 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
17340 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
17350 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
17360 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
17370 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
17380 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53  eferences to VFS
17390 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20   helper methods 
173a0 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  used for tempora
173b0 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ry files */.stat
173c0 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d  ic int winGetTem
173d0 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  pname(sqlite3_vf
173e0 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73  s *, char **);.s
173f0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
17400 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  ir(const void *)
17410 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  ;.static BOOL wi
17420 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
17430 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61  dColon(const cha
17440 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  r *);../*.** Con
17450 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
17460 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
17470 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
17480 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e  c int winFileCon
17490 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
174a0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
174b0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69  oid *pArg){.  wi
174c0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
174d0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f  winFile*)id;.  O
174e0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
174f0 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70  ile=%p, op=%d, p
17500 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Arg=%p\n", pFile
17510 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b  ->h, op, pArg));
17520 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
17530 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
17540 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
17550 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
17560 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
17570 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f  ocktype;.      O
17580 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
17590 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
175a0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
175b0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
175c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
175d0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
175e0 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
175f0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
17600 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
17610 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
17620 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
17630 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
17640 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
17650 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
17660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17670 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
17680 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
17690 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
176a0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
176b0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
176c0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
176d0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
176e0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
176f0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
17700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17710 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
17720 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
17730 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
17740 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
17750 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
17760 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
17770 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69  oldSz;.        i
17780 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53  nt rc = winFileS
17790 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b  ize(id, &oldSz);
177a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
177b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
177c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
177d0 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28  int64 newSz = *(
177e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
177f0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Arg;.          i
17800 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29  f( newSz>oldSz )
17810 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  {.            Si
17820 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
17830 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
17840 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
17850 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
17860 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
17870 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
17880 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(0);.         
17890 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
178a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
178b0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
178c0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
178d0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
178e0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
178f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17900 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
17910 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
17920 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
17930 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
17940 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17950 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
17960 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
17970 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
17980 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
17990 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
179a0 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
179b0 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
179c0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
179d0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
179e0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
179f0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
17a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17a10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
17a20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
17a30 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
17a40 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
17a50 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
17a60 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
17a70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Arg);.      OSTR
17a80 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
17a90 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
17aa0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
17ab0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
17ac0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
17ad0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
17ae0 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
17af0 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
17b00 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
17b10 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b  printf("win32");
17b20 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
17b30 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
17b40 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
17b50 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
17b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17b70 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
17b80 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
17b90 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
17ba0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
17bb0 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
17bc0 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
17bd0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65  {.        winIoe
17be0 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a  rrRetry = a[0];.
17bf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17c00 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49       a[0] = winI
17c10 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
17c20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
17c30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
17c40 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
17c50 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
17c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
17c70 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [1] = winIoerrRe
17c80 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20  tryDelay;.      
17c90 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
17ca0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
17cb0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17cc0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17ce0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
17cf0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
17d00 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
17d10 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
17d20 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  File = 0;.      
17d30 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54  int rc = winGetT
17d40 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
17d50 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20  Vfs, &zTFile);. 
17d60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17d70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17d80 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
17d90 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
17da0 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
17db0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
17dc0 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
17dd0 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
17de0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
17df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17e00 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
17e10 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
17e20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
17e30 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
17e40 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
17e50 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
17e60 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
17e70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17e80 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
17e90 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17ea0 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
17eb0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
17ec0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17ed0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
17ee0 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
17ef0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
17f00 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
17f10 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
17f20 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
17f30 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
17f40 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
17f50 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
17f60 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
17f70 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
17f80 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
17f90 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
17fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69   ){.          wi
17fb0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  nUnmapfile(pFile
17fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
17fd0 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69  = winMapfile(pFi
17fe0 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
17ff0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18000 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18010 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
18020 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
18030 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
18040 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18050 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
18060 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  f.  }.  OSTRACE(
18070 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18080 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   rc=SQLITE_NOTFO
18090 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  UND\n", pFile->h
180a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
180b0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
180c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
180d0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
180e0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
180f0 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
18100 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
18110 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
18120 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
18130 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
18140 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
18150 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
18160 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
18170 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
18180 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
18190 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
181a0 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
181b0 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
181c0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
181d0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
181e0 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
181f0 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
18200 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
18210 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
18220 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
18230 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
18240 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
18250 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
18260 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
18270 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28  3_file *id){.  (
18280 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72  void)id;.  retur
18290 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
182a0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
182b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
182c0 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
182d0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
182e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
182f0 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
18300 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
18310 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69  _file *id){.  wi
18320 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46  nFile *p = (winF
18330 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72  ile*)id;.  retur
18340 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  n SQLITE_IOCAP_U
18350 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
18360 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20  OPEN |.         
18370 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ((p->ctrlFlags &
18380 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53   WINFILE_PSOW)?S
18390 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
183a0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
183b0 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57 69  0);.}../* .** Wi
183c0 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20  ndows will only 
183d0 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66  let you create f
183e0 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67  ile view mapping
183f0 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69  s.** on allocati
18400 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72  on size granular
18410 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a  ity boundaries..
18420 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65  ** During sqlite
18430 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64  3_os_init() we d
18440 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66  o a GetSystemInf
18450 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  o().** to get th
18460 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69  e granularity si
18470 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e  ze..*/.SYSTEM_IN
18480 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
18490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
184a0 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
184b0 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
184c0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
184d0 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
184e0 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
184f0 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
18500 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
18510 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
18520 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
18530 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c  y .** this file,
18540 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
18550 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d  y be shared by m
18560 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
18570 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
18580 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
18590 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
185a0 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
185b0 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
185c0 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
185d0 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
185e0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
185f0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
18600 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
18610 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
18620 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
18630 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
18640 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
18650 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
18660 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
18670 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
18680 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
18690 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
186a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
186b0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
186c0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
186d0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
186e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
186f0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
18700 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
18710 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
18720 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
18730 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
18740 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
18750 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18760 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
18770 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
18780 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
18790 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
187a0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
187b0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
187c0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
187d0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
187e0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
187f0 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
18800 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
18810 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
18820 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
18830 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
18840 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
18850 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
18860 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
18870 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
18880 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
18890 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
188a0 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
188b0 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
188c0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
188d0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
188e0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
188f0 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
18900 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
18910 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
18920 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
18930 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
18940 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
18950 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
18960 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
18970 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
18980 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
18990 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
189a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
189b0 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
189c0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
189d0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
189e0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
189f0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
18a00 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
18a10 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
18a20 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
18a30 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
18a40 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
18a50 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
18a60 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
18a70 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
18a80 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
18a90 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
18aa0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
18ab0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
18ac0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
18ad0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
18ae0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18af0 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
18b00 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
18b10 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
18b20 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
18b30 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
18b40 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
18b50 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
18b60 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
18b70 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
18b80 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
18b90 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18bb0 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
18bc0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
18bd0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bf0 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
18c00 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
18c10 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
18c20 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
18c30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
18c40 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
18c50 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
18c60 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
18c70 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
18c80 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
18c90 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
18ca0 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
18cb0 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
18cc0 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
18cd0 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
18d00 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
18d10 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
18d20 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
18d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18d40 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
18d50 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
18d60 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
18d70 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
18d80 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
18d90 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
18da0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
18db0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
18dc0 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68  EBUG.  u8 nextSh
18dd0 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
18de0 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
18df0 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
18e00 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
18e10 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
18e20 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
18e30 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
18e40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
18e50 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
18e60 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
18e70 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
18e80 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
18e90 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
18ea0 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
18eb0 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
18ec0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
18ed0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
18ee0 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
18ef0 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
18f00 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
18f10 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
18f20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
18f30 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
18f40 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
18f50 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
18f60 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
18f70 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
18f80 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
18f90 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
18fa0 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
18fb0 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
18fc0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
18fd0 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
18fe0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
18ff0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
19000 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
19010 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
19020 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
19030 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
19040 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
19050 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
19060 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
19070 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
19080 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
19090 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
190a0 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
190b0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
190c0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
190d0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
190e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
190f0 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
19100 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
19110 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
19120 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
19130 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
19140 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
19150 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19170 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
19180 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
19190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
191a0 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
191b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191c0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
191d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
191e0 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  its winShmNode *
191f0 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
19200 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
19210 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
19220 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
19230 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
19240 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
19250 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73  )        /* firs
19260 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
19270 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44  define WIN_SHM_D
19280 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42  MS    (WIN_SHM_B
19290 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
192a0 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
192b0 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
192c0 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72  ** Apply advisor
192d0 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
192e0 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  n bytes beginnin
192f0 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64  g at ofst..*/.#d
19300 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b  efine _SHM_UNLCK
19310 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    1.#define _SHM
19320 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
19330 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a  e _SHM_WRLCK  3.
19340 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
19350 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77  mSystemLock(.  w
19360 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65  inShmNode *pFile
19370 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ,    /* Apply lo
19380 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
19390 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
193a0 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
193b0 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
193c0 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c    /* _SHM_UNLCK,
193d0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20   _SHM_RDLCK, or 
193e0 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  _SHM_WRLCK */.  
193f0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
19400 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
19410 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
19420 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
19430 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
19440 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
19450 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
19460 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
19470 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ock */.){.  int 
19480 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
19490 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
194a0 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
194b0 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
194c0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
194d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
194e0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
194f0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
19500 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
19510 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19520 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
19530 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
19540 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
19550 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
19560 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74   lock=%d, offset
19570 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c  =%d, size=%d\n",
19580 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
19590 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b  e->hFile.h, lock
195a0 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74  Type, ofst, nByt
195b0 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  e));..  /* Relea
195c0 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73  se/Acquire the s
195d0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
195e0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79   */.  if( lockTy
195f0 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29  pe==_SHM_UNLCK )
19600 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e  {.    rc = winUn
19610 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
19620 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20  >hFile.h, ofst, 
19630 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
19640 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
19650 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
19660 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
19670 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  */.    DWORD dwF
19680 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
19690 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
196a0 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  ;.    if( lockTy
196b0 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b  pe == _SHM_WRLCK
196c0 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f   ) dwFlags |= LO
196d0 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
196e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  _LOCK;.    rc = 
196f0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
19700 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46  le->hFile.h, dwF
19710 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  lags, ofst, 0, n
19720 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Byte, 0);.  }.  
19730 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
19740 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19750 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
19760 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
19770 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
19780 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
19790 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
197a0 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
197b0 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
197c0 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d   func=%s, errno=
197d0 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  %lu, rc=%s\n",. 
197e0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
197f0 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54  >hFile.h, (lockT
19800 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43  ype == _SHM_UNLC
19810 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46  K) ? "winUnlockF
19820 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20  ile" :.         
19830 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c    "winLockFile",
19840 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
19850 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  o, sqlite3ErrNam
19860 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75  e(rc)));..  retu
19870 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
19880 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
19890 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
198a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
198b0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
198c0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
198d0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
198e0 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
198f0 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
19900 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
19910 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
19920 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
19930 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
19940 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
19950 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
19960 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
19970 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
19980 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
19990 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
199a0 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
199b0 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
199c0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
199d0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
199e0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
199f0 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
19a00 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
19a10 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
19a20 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
19a30 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73  hmNode *p;.  ass
19a40 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
19a50 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52  Held() );.  OSTR
19a60 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
19a70 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46  pid=%lu, deleteF
19a80 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lag=%d\n",.     
19a90 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
19aa0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64  ntProcessId(), d
19ab0 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70  eleteFlag));.  p
19ac0 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c  p = &winShmNodeL
19ad0 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  ist;.  while( (p
19ae0 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20   = *pp)!=0 ){.  
19af0 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
19b00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
19b10 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
19b20 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d  tex ){ sqlite3_m
19b30 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
19b40 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72  ex); }.      for
19b50 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
19b60 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
19b70 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55    BOOL bRc = osU
19b80 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
19b90 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
19ba0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
19bb0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
19bc0 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  UNMAP pid=%lu, r
19bd0 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
19be0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19bf0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
19c00 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
19c10 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
19c20 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
19c30 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
19c40 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
19c50 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
19c60 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
19c70 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
19c80 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
19c90 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45  "SHM-PURGE-CLOSE
19ca0 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
19cb0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
19ce0 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
19cf0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
19d00 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
19d10 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
19d20 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d  UE(bRc);.      }
19d30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46  .      if( p->hF
19d40 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  ile.h!=NULL && p
19d50 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c  ->hFile.h!=INVAL
19d60 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
19d70 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
19d80 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19d90 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
19da0 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
19db0 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
19dc0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
19dd0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
19de0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
19df0 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
19e00 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
19e10 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
19e20 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(1);.        sq
19e30 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
19e40 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
19e50 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
19e60 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
19e70 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
19e80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
19e90 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69  oc();.        Si
19ea0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
19eb0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
19ec0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
19ed0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
19ee0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
19ef0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
19f00 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
19f10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
19f20 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
19f30 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
19f40 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
19f50 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
19f60 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
19f70 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
19f80 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
19f90 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
19fa0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
19fb0 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
19fc0 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
19fd0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
19fe0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
19ff0 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
1a000 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
1a010 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
1a020 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
1a030 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
1a040 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
1a050 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
1a060 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1a070 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1a080 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
1a090 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1a0a0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1a0b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1a0c0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1a0d0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1a0e0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1a0f0 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
1a100 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1a110 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1a120 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1a150 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
1a160 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
1a170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1a180 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
1a190 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
1a1a0 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
1a1d0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
1a1e0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
1a1f0 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
1a200 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
1a210 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
1a220 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1a230 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
1a240 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
1a250 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
1a260 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
1a270 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1a280 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
1a290 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
1a2a0 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
1a2b0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1a2c0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
1a2d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1a2e0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1a2f0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
1a300 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a  trlen30(pDbFd->z
1a310 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Path);.  pNew = 
1a320 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1a330 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  o( sizeof(*pShmN
1a340 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31  ode) + nName + 1
1a350 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  7 );.  if( pNew=
1a360 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a370 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72  3_free(p);.    r
1a380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1a390 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
1a3a0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
1a3b0 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
1a3c0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1a3d0 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20  rintf(nName+15, 
1a3e0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  pNew->zFilename,
1a3f0 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
1a400 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69  ->zPath);.  sqli
1a410 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
1a420 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65  DbFd->zPath, pNe
1a430 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a  w->zFilename); .
1a440 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
1a450 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1a460 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
1a470 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
1a480 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
1a490 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
1a4a0 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
1a4b0 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
1a4c0 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
1a4d0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1a4e0 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
1a4f0 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
1a500 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
1a510 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
1a520 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
1a530 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
1a540 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
1a550 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
1a560 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
1a570 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
1a580 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
1a590 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1a5a0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1a5b0 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
1a5c0 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
1a5d0 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
1a5e0 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
1a5f0 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
1a600 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1a610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
1a620 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
1a630 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
1a640 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
1a650 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
1a660 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
1a670 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
1a680 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
1a690 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1a6a0 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
1a6b0 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
1a6c0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d  .    pShmNode->m
1a6d0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  utex = sqlite3_m
1a6e0 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1a6f0 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
1a700 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
1a710 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
1a720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1a730 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1a740 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
1a750 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
1a760 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62  rc = winOpen(pDb
1a770 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20  Fd->pVfs,.      
1a780 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
1a790 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
1a7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a7b0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1a7c0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20  (UTF-8) */.     
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
1a7e0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d  ite3_file*)&pShm
1a7f0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a  Node->hFile,  /*
1a800 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   File handle her
1a810 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1a820 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1a830 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f  N_WAL | SQLITE_O
1a840 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1a850 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1a860 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
1a870 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28       0);.    if(
1a880 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
1a890 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  {.      goto shm
1a8a0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1a8b0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
1a8c0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
1a8d0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1a8e0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
1a8f0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20   switch..    ** 
1a900 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65  If not, truncate
1a910 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72   the file to zer
1a920 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a  o length. .    *
1a930 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
1a940 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1a950 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
1a960 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1a970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a980 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1a990 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1a9a0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1a9b0 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
1a9c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a9d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1a9e0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1a9f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1aa00 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45  OPEN, osGetLastE
1aa10 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa30 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
1aa40 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1aa50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1aa60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1aa70 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
1aa80 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1aa90 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1aaa0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1aab0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1aac0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1aad0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1aae0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1aaf0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1ab00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
1ab10 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
1ab20 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
1ab30 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
1ab40 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
1ab50 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1ab60 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1ab70 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
1ab80 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
1ab90 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1aba0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1abb0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1abc0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1abd0 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1abe0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1abf0 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1ac00 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1ac10 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1ac20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1ac30 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1ac40 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1ac50 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1ac60 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1ac70 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1ac80 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1ac90 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1aca0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1acb0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1acc0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1acd0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1ace0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1acf0 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1ad00 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1ad10 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1ad20 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1ad30 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1ad40 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1ad50 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
1ad60 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
1ad70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ad80 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1ad90 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
1ada0 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
1adb0 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
1adc0 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
1add0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ade0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1adf0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1ae00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1ae10 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1ae20 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1ae30 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
1ae40 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1ae50 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
1ae60 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1ae70 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
1ae80 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
1ae90 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
1aea0 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1aeb0 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1aec0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1aed0 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
1aee0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
1aef0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1af00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1af10 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1af20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
1af30 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
1af40 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
1af50 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
1af60 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
1af70 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1af80 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
1af90 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1afa0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1afb0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1afc0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1afd0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
1afe0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
1aff0 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
1b000 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
1b010 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1b020 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
1b030 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1b040 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1b050 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
1b060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b070 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1b080 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
1b090 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1b0a0 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
1b0b0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
1b0c0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1b0d0 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
1b0e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1b0f0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1b100 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1b110 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
1b120 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
1b130 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
1b140 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1b150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
1b160 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1b170 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
1b180 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1b190 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1b1a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1b1b0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1b1c0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1b1d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b1e0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1b1f0 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1b200 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1b210 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1b220 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1b230 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1b240 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1b250 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1b260 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1b270 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1b280 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1b290 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1b2a0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1b2b0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1b2c0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1b2d0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1b2e0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1b2f0 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1b300 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1b310 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1b320 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1b330 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1b340 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1b350 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1b360 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1b370 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
1b380 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1b390 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
1b3a0 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
1b3b0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
1b3c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b3d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1b3e0 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1b3f0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1b400 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
1b410 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
1b420 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
1b430 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1b440 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1b450 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1b460 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1b470 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1b480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1b490 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
1b4a0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1b4b0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b4d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
1b4e0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
1b4f0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1b500 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1b510 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
1b520 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
1b530 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
1b540 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1b550 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
1b560 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1b570 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1b580 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1b590 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1b5a0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1b5b0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
1b5c0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
1b5d0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
1b5e0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b600 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1b610 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
1b620 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1b630 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1b640 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1b650 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1b680 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1b6b0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
1b6c0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
1b6d0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
1b6e0 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
1b6f0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1b700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
1b710 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
1b720 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1b730 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1b740 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1b750 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1b760 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1b770 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1b780 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
1b790 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1b7a0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1b7b0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1b7c0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1b7d0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1b7e0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1b7f0 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
1b800 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1b810 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1b820 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
1b830 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
1b840 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
1b850 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
1b860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
1b870 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
1b880 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
1b890 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1b8a0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1b8b0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1b8c0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
1b8d0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
1b8e0 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
1b8f0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1b900 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
1b910 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
1b920 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
1b930 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
1b940 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1b950 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1b960 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1b970 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
1b980 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b990 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
1b9a0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
1b9b0 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
1b9c0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
1b9d0 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
1b9e0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1b9f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
1ba00 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
1ba10 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
1ba20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
1ba30 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1ba40 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1ba50 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1ba60 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
1ba70 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1ba80 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
1ba90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1baa0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
1bab0 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
1bac0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1bad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bae0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
1baf0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1bb00 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1bb10 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1bb20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
1bb30 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1bb40 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
1bb50 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
1bb60 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
1bb70 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1bb80 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
1bb90 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
1bba0 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
1bbb0 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
1bbc0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
1bbd0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
1bbe0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
1bbf0 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
1bc00 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
1bc10 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1bc20 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
1bc30 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
1bc40 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
1bc50 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1bc60 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1bc70 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1bc80 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1bc90 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1bca0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1bcb0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1bcc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1bcd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
1bce0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
1bcf0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1bd00 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
1bd10 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
1bd20 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
1bd30 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
1bd40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bd50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1bd60 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
1bd70 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1bd80 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1bd90 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1bda0 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
1bdb0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1bdc0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
1bdd0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
1bde0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1bdf0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1be00 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
1be10 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
1be20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1be30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1be40 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
1be50 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
1be60 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
1be70 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
1be80 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
1be90 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
1bea0 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
1beb0 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
1bec0 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
1bed0 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
1bee0 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
1bef0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
1bf00 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1bf10 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
1bf20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
1bf30 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
1bf40 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
1bf50 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1bf60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1bf70 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1bf80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1bf90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1bfa0 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
1bfb0 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
1bfc0 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
1bfd0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
1bfe0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
1bff0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
1c000 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
1c010 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
1c020 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c040 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1c050 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1c060 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
1c070 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1c080 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1c090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c0a0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
1c0b0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
1c0c0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
1c0d0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
1c0e0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
1c0f0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1c100 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1c110 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c120 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1c130 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64  LOCK pid=%lu, id
1c140 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d  =%d, sharedMask=
1c150 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25  %03x, exclMask=%
1c160 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  03x, rc=%s\n",. 
1c170 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1c180 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1c190 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61  ), p->id, p->sha
1c1a0 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
1c1b0 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Mask,.          
1c1c0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1c1d0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
1c1e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
1c1f0 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
1c200 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
1c210 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
1c220 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
1c230 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
1c240 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
1c250 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
1c260 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
1c270 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
1c280 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
1c290 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
1c2a0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1c2b0 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
1c2c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1c2d0 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
1c2e0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1c2f0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1c300 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
1c310 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1c320 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72  .  /* MemoryBarr
1c330 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e  ier(); // does n
1c340 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f  ot work -- do no
1c350 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a  t know why not *
1c360 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1c370 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d  utex();.  winShm
1c380 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
1c390 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1c3a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1c3b0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
1c3c0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
1c3d0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
1c3e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
1c3f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1c400 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c410 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
1c420 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
1c430 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
1c440 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
1c450 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
1c460 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
1c470 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
1c480 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
1c490 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c4a0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1c4b0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1c4c0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
1c4d0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
1c4e0 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72  ise, if the isWr
1c4f0 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ite parameter is
1c500 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
1c510 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
1c520 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
1c530 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
1c540 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
1c550 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
1c560 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
1c570 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
1c580 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
1c590 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
1c5a0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1c5b0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72  ned. If .** isWr
1c5c0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ite is non-zero 
1c5d0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1c5e0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
1c5f0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
1c600 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
1c610 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
1c620 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
1c630 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1c640 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
1c650 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
1c660 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
1c670 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
1c680 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
1c690 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
1c6a0 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
1c6b0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
1c6c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1c6d0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
1c6e0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1c6f0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
1c700 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1c710 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
1c720 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
1c730 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
1c740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1c750 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
1c760 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1c770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1c780 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
1c790 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
1c7a0 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c7c0 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
1c7d0 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
1c7e0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
1c7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1c800 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
1c810 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20    int isWrite,  
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c830 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
1c840 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
1c850 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
1c860 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
1c870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1c880 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
1c890 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1c8a0 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
1c8b0 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d  le*)fd;.  winShm
1c8c0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1c8d0 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  m;.  winShmNode 
1c8e0 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
1c8f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c900 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ..  if( !p ){.  
1c910 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
1c920 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
1c930 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c940 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1c950 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44  n rc;.    p = pD
1c960 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
1c970 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1c980 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69  ShmNode;..  sqli
1c990 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1c9a0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1c9b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
1c9c0 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
1c9d0 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
1c9e0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
1c9f0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
1ca00 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1ca10 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
1ca20 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
1ca30 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
1ca40 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
1ca50 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
1ca60 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
1ca70 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
1ca80 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
1ca90 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
1caa0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
1cab0 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
1cac0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1cad0 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
1cae0 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
1caf0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
1cb00 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
1cb10 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
1cb20 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
1cb30 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
1cb40 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
1cb50 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
1cb60 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
1cb70 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
1cb80 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
1cb90 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
1cba0 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
1cbb0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
1cbc0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
1cbd0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
1cbe0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1cbf0 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
1cc00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1cc10 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1cc20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
1cc30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cc40 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1cc50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1cc60 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1cc70 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31       "winShmMap1
1cca0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1ccb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1ccc0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1ccd0 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74  .    if( sz<nByt
1cce0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
1ccf0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1cd00 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
1cd10 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73 57  ot exist. If isW
1cd20 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20  rite is set to. 
1cd30 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78       ** zero, ex
1cd40 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69  it early. *pp wi
1cd50 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c  ll be set to NUL
1cd60 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1cd70 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20  returned..      
1cd80 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65  **.      ** Alte
1cd90 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73  rnatively, if is
1cda0 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  Write is non-zer
1cdb0 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74 65  o, use ftruncate
1cdc0 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20  () to allocate. 
1cdd0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
1cde0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1cdf0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
1ce00 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74 65      if( !isWrite
1ce10 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
1ce20 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  out;.      rc = 
1ce30 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1ce40 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1ce50 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42  mNode->hFile, nB
1ce60 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  yte);.      if( 
1ce70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ce80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1ce90 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1cea0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1ceb0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1cec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ced0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
1cee0 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
1cef0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
1cf00 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1cf10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cf20 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
1cf30 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1cf40 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
1cf50 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
1cf60 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
1cf70 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
1cf80 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
1cf90 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
1cfa0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1cfb0 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
1cfc0 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
1cfd0 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
1cfe0 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
1cff0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d000 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1d010 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1d020 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
1d030 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1d040 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
1d050 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
1d060 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
1d070 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
1d080 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20  LE hMap = NULL; 
1d090 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
1d0a0 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
1d0b0 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
1d0c0 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
1d0d0 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
1d0e0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  mory region */. 
1d0f0 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f      .#if SQLITE_
1d100 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68  OS_WINRT.      h
1d110 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1d120 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
1d130 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1d140 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1d150 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1d160 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a  TE, nByte, NULL.
1d170 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
1d180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
1d190 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
1d1a0 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
1d1b0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1d1c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1d1d0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55  h, .          NU
1d1e0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1d1f0 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1d200 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
1d210 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1d220 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1d230 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1d240 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1d250 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gA(pShmNode->hFi
1d260 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
1d270 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1d280 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
1d290 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1d2a0 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1d2b0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52  ACE(("SHM-MAP-CR
1d2c0 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  EATE pid=%lu, re
1d2d0 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64  gion=%d, size=%d
1d2e0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1d2f0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d300 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d310 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
1d320 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20  egion, nByte,.  
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61               hMa
1d340 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
1d350 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ed"));.      if(
1d360 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20   hMap ){.       
1d370 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70   int iOffset = p
1d380 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d390 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20  *szRegion;.     
1d3a0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
1d3b0 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
1d3c0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
1d3d0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
1d3e0 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ty;.#if SQLITE_O
1d3f0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20  S_WINRT.        
1d400 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
1d410 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d  OfFileFromApp(hM
1d420 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
1d430 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
1d440 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
1d450 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1d460 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1d470 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1d480 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
1d490 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1d4a0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
1d4b0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1d4c0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1d4d0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1d4e0 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
1d4f0 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
1d500 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
1d510 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
1d520 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
1d530 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1d540 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  -MAP pid=%lu, re
1d550 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d  gion=%d, offset=
1d560 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
1d570 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1d580 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1d590 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1d5a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1d5b0 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
1d5d0 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
1d5e0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1d5f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d600 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
1d610 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
1d620 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1d630 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1d640 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1d650 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1d660 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
1d670 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
1d680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d690 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1d6a0 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
1d6b0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
1d6c0 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
1d6d0 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
1d6e0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1d6f0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1d700 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1d710 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1d720 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
1d730 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
1d740 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1d750 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1d760 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
1d770 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1d780 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
1d790 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
1d7a0 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
1d7b0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
1d7c0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
1d7d0 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
1d7e0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
1d7f0 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1d800 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1d810 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1d820 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1d830 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
1d840 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
1d850 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
1d860 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
1d870 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
1d880 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
1d890 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
1d8a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1d8b0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1d8c0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1d8d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1d8e0 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
1d8f0 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
1d900 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
1d910 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
1d920 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
1d930 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d  define winShmUnm
1d940 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
1d950 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1d960 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
1d970 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65  ** Cleans up the
1d980 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f   mapped region o
1d990 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
1d9a0 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  file, if any..*/
1d9b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1d9c0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
1d9d0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
1d9e0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
1d9f0 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  le){.  assert( p
1da00 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54  File!=0 );.  OST
1da10 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1da20 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1da30 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d  =%p, hMap=%p, pM
1da40 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1da50 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53            "mmapS
1da60 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ize=%lld, mmapSi
1da70 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d  zeActual=%lld, m
1da80 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c  mapSizeMax=%lld\
1da90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1daa0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1dab0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
1dac0 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c  File->hMap, pFil
1dad0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20  e->pMapRegion,. 
1dae0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1daf0 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65  >mmapSize, pFile
1db00 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1db10 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  , pFile->mmapSiz
1db20 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46  eMax));.  if( pF
1db30 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
1db40 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e  ){.    if( !osUn
1db50 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
1db60 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1db70 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1db80 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1db90 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1dba0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
1dbb0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1dbc0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
1dbd0 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
1dbf0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
1dc00 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
1dc10 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1dc20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
1dc30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61        pFile->pMa
1dc40 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
1dc50 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1dc60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1dc70 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1dc80 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31    "winUnmapfile1
1dcb0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1dcc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1dcd0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
1dce0 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  0;.    pFile->mm
1dcf0 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
1dd00 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
1dd10 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  ctual = 0;.  }. 
1dd20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70   if( pFile->hMap
1dd30 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  !=NULL ){.    if
1dd40 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ( !osCloseHandle
1dd50 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b  (pFile->hMap) ){
1dd60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1dd70 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1dd80 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1dd90 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1dda0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1ddb0 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25  pFile=%p, hMap=%
1ddc0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
1ddd0 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
1dde0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1ddf0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1de00 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
1de10 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20  ->hMap));.      
1de20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
1de30 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1de40 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
1de50 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22   "winUnmapfile2"
1de80 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1de90 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
1dea0 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
1deb0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55   }.  OSTRACE(("U
1dec0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1ded0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1dee0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
1def0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1df00 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1df10 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  , pFile));.  ret
1df20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1df30 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
1df40 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
1df50 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
1df60 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1df70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
1df80 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
1df90 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
1dfa0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
1dfb0 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
1dfc0 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74  w). Or, if .** t
1dfd0 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
1dfe0 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
1dff0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
1e000 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
1e010 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67   .** outstanding
1e020 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65   xFetch() refere
1e030 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73  nces to it, this
1e040 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1e050 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  o-op..**.** If p
1e060 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69  arameter nByte i
1e070 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20  s non-negative, 
1e080 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
1e090 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66  equested size of
1e0a0 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67   .** the mapping
1e0b0 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65   to create. Othe
1e0c0 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20  rwise, if nByte 
1e0d0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
1e0e0 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  o, then the .** 
1e0f0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
1e100 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
1e110 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
1e120 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
1e130 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
1e140 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
1e150 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
1e160 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
1e170 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a  lue configured .
1e180 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f  ** using SQLITE_
1e190 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
1e1a0 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d   whichever is sm
1e1b0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  aller..**.** SQL
1e1c0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1e1d0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
1e1e0 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74  ccurs (even if t
1e1f0 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1e200 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61  t.** recreated a
1e210 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75  s a result of ou
1e220 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1e230 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69  nces) or an SQLi
1e240 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
1e250 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1e260 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70  tatic int winMap
1e270 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1e280 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
1e290 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74   nByte){.  sqlit
1e2a0 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20  e3_int64 nMap = 
1e2b0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b  nByte;.  int rc;
1e2c0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ..  assert( nMap
1e2d0 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74  >=0 || pFd->nFet
1e2e0 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53  chOut==0 );.  OS
1e2f0 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1e300 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1e310 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22  %p, size=%lld\n"
1e320 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1e330 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1e340 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65  Id(), pFd, nByte
1e350 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e  ));..  if( pFd->
1e360 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
1e370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e380 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
1e390 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1e3a0 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1e3b0 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29  ile*)pFd, &nMap)
1e3c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
1e3d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1e3e0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1e3f0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1e400 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1e410 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  T\n",.          
1e420 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e430 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1e440 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d));.      retur
1e450 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
1e460 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  STAT;.    }.  }.
1e470 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e    if( nMap>pFd->
1e480 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20  mmapSizeMax ){. 
1e490 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d     nMap = pFd->m
1e4a0 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a  mapSizeMax;.  }.
1e4b0 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69    nMap &= ~(sqli
1e4c0 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79  te3_int64)(winSy
1e4d0 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
1e4e0 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66 28 20 6e   - 1);. .  if( n
1e4f0 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d  Map==0 && pFd->m
1e500 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
1e510 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1e520 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  d);.  }.  if( nM
1e530 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
1e540 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  e ){.    void *p
1e550 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f  New = 0;.    DWO
1e560 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47  RD protect = PAG
1e570 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1e580 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49  DWORD flags = FI
1e590 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20  LE_MAP_READ;..  
1e5a0 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1e5b0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 28 70 46  Fd);.    if( (pF
1e5c0 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  d->ctrlFlags & W
1e5d0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  INFILE_RDONLY)==
1e5e0 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  0 ){.      prote
1e5f0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52  ct = PAGE_READWR
1e600 49 54 45 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  ITE;.      flags
1e610 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49   |= FILE_MAP_WRI
1e620 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  TE;.    }.#if SQ
1e630 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1e640 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73    pFd->hMap = os
1e650 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1e660 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c  gFromApp(pFd->h,
1e670 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20   NULL, protect, 
1e680 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  nMap, NULL);.#el
1e690 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1e6a0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1e6b0 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  ).    pFd->hMap 
1e6c0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1e6d0 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e  ppingW(pFd->h, N
1e6e0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20  ULL, protect,.  
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1e710 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29  WORD)((nMap>>32)
1e720 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a   & 0xffffffff),.
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e750 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30  (DWORD)(nMap & 0
1e760 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c  xffffffff), NULL
1e770 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1e780 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
1e790 53 5f 41 4e 53 49 29 0a 20 20 20 20 70 46 64 2d  S_ANSI).    pFd-
1e7a0 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
1e7b0 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64  FileMappingA(pFd
1e7c0 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1e7d0 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61      (DWORD)((nMa
1e800 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66  p>>32) & 0xfffff
1e810 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20  fff),.          
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e830 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d        (DWORD)(nM
1e840 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29  ap & 0xffffffff)
1e850 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a  , NULL);.#endif.
1e860 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61      if( pFd->hMa
1e870 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  p==NULL ){.     
1e880 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20   pFd->lastErrno 
1e890 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1e8a0 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
1e8b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1e8c0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1e8d0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  d->lastErrno,.  
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65       "winMapfile
1e900 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b  1", pFd->zPath);
1e910 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68  .      /* Log th
1e920 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e  e error, but con
1e930 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65  tinue normal ope
1e940 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65  ration using xRe
1e950 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20  ad/xWrite */.   
1e960 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1e970 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64  -FILE-CREATE pid
1e980 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1e990 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1e9a0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e9b0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e9c0 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
1e9d0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
1e9e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e9f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  _OK;.    }.    a
1ea00 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77  ssert( (nMap % w
1ea10 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
1ea20 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Size)==0 );.    
1ea30 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53  assert( sizeof(S
1ea40 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73  IZE_T)==sizeof(s
1ea50 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c  qlite3_int64) ||
1ea60 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66   nMap<=0xfffffff
1ea70 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  f );.#if SQLITE_
1ea80 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65  OS_WINRT.    pNe
1ea90 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  w = osMapViewOfF
1eaa0 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ileFromApp(pFd->
1eab0 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
1eac0 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23  (SIZE_T)nMap);.#
1ead0 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20  else.    pNew = 
1eae0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
1eaf0 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
1eb00 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29  , 0, 0, (SIZE_T)
1eb10 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nMap);.#endif.  
1eb20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c    if( pNew==NULL
1eb30 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73   ){.      osClos
1eb40 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61  eHandle(pFd->hMa
1eb50 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68  p);.      pFd->h
1eb60 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Map = NULL;.    
1eb70 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
1eb80 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1eb90 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
1eba0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1ebb0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1ebc0 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
1ebf0 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e2", pFd->zPath)
1ec00 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
1ec10 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
1ec20 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
1ec30 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
1ec40 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
1ec50 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
1ec60 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25  P-FILE-MAP pid=%
1ec70 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1ec80 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1ec90 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1eca0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ecb0 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
1ecc0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
1ecd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ece0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64  K;.    }.    pFd
1ecf0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70  ->pMapRegion = p
1ed00 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  New;.    pFd->mm
1ed10 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  apSize = nMap;. 
1ed20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
1ed30 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20  Actual = nMap;. 
1ed40 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1ed50 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1ed60 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
1ed70 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
1ed80 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1ed90 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1eda0 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e   pFd));.  return
1edb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1edc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
1edd0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
1ede0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
1edf0 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
1ee00 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
1ee10 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
1ee20 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
1ee30 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
1ee40 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
1ee50 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
1ee60 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
1ee70 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
1ee80 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
1ee90 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
1eea0 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
1eeb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1eec0 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
1eed0 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
1eee0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
1eef0 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
1ef00 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
1ef10 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
1ef20 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
1ef30 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1ef40 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
1ef50 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
1ef60 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
1ef70 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
1ef80 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
1ef90 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
1efa0 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
1efb0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
1efc0 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
1efd0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
1efe0 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69  ce by calling wi
1eff0 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  nUnfetch()..*/.s
1f000 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74  tatic int winFet
1f010 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
1f020 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
1f030 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
1f040 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
1f050 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1f060 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
1f070 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1f080 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1f090 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1f0a0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
1f0b0 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
1f0c0 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
1f0d0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
1f0e0 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d  et=%lld, amount=
1f0f0 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20  %d, pp=%p\n",.  
1f100 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f110 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f120 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74  , fd, iOff, nAmt
1f130 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c  , pp));..#if SQL
1f140 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1f150 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
1f160 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
1f170 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
1f180 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
1f190 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1f1a0 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
1f1b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f1d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1f1e0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
1f1f0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1f200 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f210 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1f220 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
1f230 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1f240 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
1f250 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f260 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1f270 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
1f280 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
1f290 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
1f2a0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
1f2b0 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
1f2c0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
1f2d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1f2e0 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
1f2f0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
1f300 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20  File=%p, pp=%p, 
1f310 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  *pp=%p, rc=SQLIT
1f320 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1f330 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f340 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
1f350 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65   pp, *pp));.  re
1f360 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f370 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1f380 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
1f390 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
1f3a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1f3b0 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
1f3c0 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
1f3d0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
1f3e0 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
1f3f0 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
1f400 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1f410 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1f420 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
1f430 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
1f440 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
1f450 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
1f460 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
1f470 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
1f480 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  . .**.** Or, if 
1f490 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
1f4a0 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
1f4b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1f4c0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a  s being called .
1f4d0 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65  ** to inform the
1f4e0 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c   VFS layer that,
1f4f0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f   according to PO
1f500 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e  SIX, any existin
1f510 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61  g mapping .** ma
1f520 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
1f530 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
1f540 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
1f550 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
1f560 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
1f570 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
1f580 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
1f590 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1f5a0 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
1f5b0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1f5c0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1f5d0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1f5e0 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
1f5f0 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
1f600 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
1f610 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
1f620 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
1f630 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
1f640 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
1f650 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
1f660 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
1f670 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
1f680 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
1f690 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
1f6a0 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
1f6b0 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
1f6c0 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
1f6d0 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
1f6e0 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
1f6f0 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
1f700 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
1f710 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
1f720 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
1f730 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
1f740 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
1f750 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
1f760 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
1f770 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20  ld, p=%p\n",.   
1f780 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f790 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f7a0 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b   pFd, iOff, p));
1f7b0 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ..  if( p ){.   
1f7c0 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d   pFd->nFetchOut-
1f7d0 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  -;.  }else{.    
1f7e0 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69  /* FIXME:  If Wi
1f7f0 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61  ndows truly alwa
1f800 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e  ys prevents trun
1f810 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69  cating or deleti
1f820 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ng a.    ** file
1f830 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67   while a mapping
1f840 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74   is held, then t
1f850 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e  he following win
1f860 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c  Unmapfile() call
1f870 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63  .    ** is unnec
1f880 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20 62  essary can can b
1f890 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74 65  e omitted - pote
1f8a0 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e  ntially improvin
1f8b0 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d  g.    ** perform
1f8c0 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69  ance.  */.    wi
1f8d0 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b  nUnmapfile(pFd);
1f8e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f8f0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d  pFd->nFetchOut>=
1f900 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  0 );.#endif..  O
1f910 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48  STRACE(("UNFETCH
1f920 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1f930 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1f940 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f950 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f960 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a 20  essId(), fd));. 
1f970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f980 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
1f990 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1f9a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1f9b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1f9c0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1f9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1f9e0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1f9f0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1fa00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa10 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1fa20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa60 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1fa70 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
1fa80 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
1fa90 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
1faa0 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71  rate on an.** sq
1fab0 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77  lite3_file for w
1fac0 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  in32..*/.static 
1fad0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
1fae0 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65  _methods winIoMe
1faf0 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20  thod = {.  3,   
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
1fb20 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43  ersion */.  winC
1fb30 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fb50 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65  Close */.  winRe
1fb60 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
1fb70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
1fb80 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74  ead */.  winWrit
1fb90 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1fba0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1fbb0 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63  te */.  winTrunc
1fbc0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1fbd0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
1fbe0 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e  cate */.  winSyn
1fbf0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1fc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
1fc10 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53  nc */.  winFileS
1fc20 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
1fc30 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1fc40 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63  Size */.  winLoc
1fc50 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1fc60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1fc70 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63  ck */.  winUnloc
1fc80 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1fc90 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1fca0 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b  ck */.  winCheck
1fcb0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
1fcc0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
1fcd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
1fce0 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  .  winFileContro
1fcf0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1fd00 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72     /* xFileContr
1fd10 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f  ol */.  winSecto
1fd20 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  rSize,          
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74          /* xSect
1fd40 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44  orSize */.  winD
1fd50 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1fd60 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  tics,       /* x
1fd70 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1fd80 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68  stics */.  winSh
1fd90 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mMap,           
1fda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1fdb0 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68  hmMap */.  winSh
1fdc0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
1fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1fde0 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53  hmLock */.  winS
1fdf0 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20  hmBarrier,      
1fe00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fe10 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20  ShmBarrier */.  
1fe20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  winShmUnmap,    
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe40 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a  /* xShmUnmap */.
1fe50 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20 20    winFetch,     
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20    /* xFetch */. 
1fe80 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20 20   winUnfetch     
1fe90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fea0 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a   /* xUnfetch */.
1feb0 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  };../***********
1fec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ff00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1ff10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
1ff20 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
1ff30 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1ff40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1ff50 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
1ff60 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
1ff70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1ff80 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
1ff90 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
1ffa0 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66   object..*/..#if
1ffb0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
1ffc0 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  N__)./*.** Conve
1ffd0 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66 72  rt a filename fr
1ffe0 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65 20  om whatever the 
1fff0 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
20000 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73  ting system.** s
20010 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c 65  upports for file
20020 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d 38  names into UTF-8
20030 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
20040 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a 2a   the result is.*
20050 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
20060 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
20070 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
20080 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
20090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
200a0 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74   *winConvertToUt
200b0 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
200c0 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
200d0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76  ){.  char *zConv
200e0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
200f0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
20100 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
20110 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
20120 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
20130 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
20140 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
20150 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
20160 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
20170 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
20180 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
20190 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
201a0 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
201b0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
201c0 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
201d0 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ted;.}.#endif../
201e0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
201f0 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e  TF-8 filename in
20200 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d  to whatever form
20210 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
20220 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
20230 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61  tem wants filena
20240 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74  mes in.  Space t
20250 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c  o hold the resul
20260 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  t.** is obtained
20270 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64   from malloc and
20280 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
20290 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
202a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
202b0 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f  atic void *winCo
202c0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
202d0 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72  ename(const char
202e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
202f0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
20300 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73   = 0;.  if( osIs
20310 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
20320 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38  verted = winUtf8
20330 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
20340 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ame);.  }.#ifdef
20350 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
20360 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
20370 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
20380 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
20390 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65  f8_to_mbcs(zFile
203a0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  name);.  }.#endi
203b0 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69  f.  /* caller wi
203c0 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ll handle out of
203d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74   memory */.  ret
203e0 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  urn zConverted;.
203f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
20400 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
20410 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
20420 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20 73  pecified UTF-8 s
20430 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20  tring buffer.** 
20440 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72 65  ends with a dire
20450 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
20460 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e 65  character or one
20470 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
20480 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69 74  y.** added to it
20490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
204a0 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53  winMakeEndInDirS
204b0 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  ep(int nBuf, cha
204c0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28 20  r *zBuf){.  if( 
204d0 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  zBuf ){.    int 
204e0 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
204f0 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
20500 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a    if( nLen>0 ){.
20510 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
20520 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d  irSep(zBuf[nLen-
20530 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  1]) ){.        r
20540 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
20550 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c  else if( nLen+1<
20560 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nBuf ){.        
20570 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e  zBuf[nLen] = win
20580 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20 20  GetDirSep();.   
20590 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31       zBuf[nLen+1
205a0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
205b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
205c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
205d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
205e0 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
205f0 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
20600 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
20610 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72 20  sulting pointer 
20620 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54  into pzBuf..** T
20630 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
20640 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75 73  ned in pzBuf mus
20650 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20 73  t be freed via s
20660 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
20670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20680 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
20690 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
206a0 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20  har **pzBuf){.  
206b0 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
206c0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
206d0 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
206e0 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
206f0 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
20700 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
20710 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
20720 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
20730 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53 74  nPre = sqlite3St
20740 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45  rlen30(SQLITE_TE
20750 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
20760 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75  .  int nMax, nBu
20770 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20  f, nDir, nLen;. 
20780 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
20790 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
207a0 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
207b0 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
207c0 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
207d0 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
207e0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
207f0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
20800 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
20810 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
20820 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
20830 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
20840 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
20850 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
20860 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20870 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
20880 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
20890 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
208a0 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66  file.  ** name f
208b0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
208c0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20   file.  If this 
208d0 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74  fails, we cannot
208e0 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a   continue..  */.
208f0 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d    nMax = pVfs->m
20900 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20  xPathname; nBuf 
20910 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42  = nMax + 2;.  zB
20920 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  uf = sqlite3Mall
20930 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a  ocZero( nBuf );.
20940 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20    if( !zBuf ){. 
20950 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
20960 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
20970 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20980 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
20990 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
209a0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
209b0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
209c0 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61  ffective tempora
209d0 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46  ry directory.  F
209e0 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f  irst, check if o
209f0 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  ne.  ** has been
20a00 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20   explicitly set 
20a10 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
20a20 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75  on; otherwise, u
20a30 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20  se the one.  ** 
20a40 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
20a50 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
20a60 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20  em..  */.  nDir 
20a70 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b  = nMax - (nPre +
20a80 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20   15);.  assert( 
20a90 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  nDir>0 );.  if( 
20aa0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
20ab0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  ectory ){.    in
20ac0 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69  t nDirLen = sqli
20ad0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
20ae0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
20af0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  ry);.    if( nDi
20b00 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  rLen>0 ){.      
20b10 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70  if( !winIsDirSep
20b20 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
20b30 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d  rectory[nDirLen-
20b40 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  1]) ){.        n
20b50 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  DirLen++;.      
20b60 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72  }.      if( nDir
20b70 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20  Len>nDir ){.    
20b80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20b90 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
20ba0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
20bb0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
20bc0 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
20bd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
20be0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
20bf0 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
20c00 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b  tTempname1", 0);
20c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
20c20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
20c30 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
20c40 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
20c50 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
20c60 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
20c70 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
20c80 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
20c90 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
20ca0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
20cb0 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51  0, /* getenv("SQ
20cc0 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f  LITE_TMPDIR") */
20cd0 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
20ce0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a  tenv("TMPDIR") *
20cf0 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
20d00 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a  etenv("TMP") */.
20d10 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
20d20 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20  env("TEMP") */. 
20d30 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
20d40 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
20d50 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61  ) */.       "/va
20d60 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
20d70 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
20d80 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20    "/tmp",.      
20d90 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20   ".",.       0  
20da0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
20db0 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20  rminator */.    
20dc0 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  };.    unsigned 
20dd0 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
20de0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
20df0 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ..    if( !azDir
20e00 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d  s[0] ) azDirs[0]
20e10 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
20e20 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  E_TMPDIR");.    
20e30 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
20e40 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
20e50 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
20e60 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32     if( !azDirs[2
20e70 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20  ] ) azDirs[2] = 
20e80 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20  getenv("TMP");. 
20e90 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33     if( !azDirs[3
20ea0 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20  ] ) azDirs[3] = 
20eb0 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a  getenv("TEMP");.
20ec0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
20ed0 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d  4] ) azDirs[4] =
20ee0 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
20ef0 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28  FILE");.    for(
20f00 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
20f10 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
20f20 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
20f30 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
20f40 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
20f50 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44  ed;.      if( zD
20f60 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
20f70 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
20f80 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69  e path starts wi
20f90 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
20fa0 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  r followed by th
20fb0 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a  e colon.      **
20fc0 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75   character, assu
20fd0 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  me it is already
20fe0 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
20ff0 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c  path; otherwise,
21000 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73  .      ** it mus
21010 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74  t be converted t
21020 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  o a native Win32
21030 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79   path via the Cy
21040 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a  gwin API.      *
21050 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67  * prior to using
21060 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
21070 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69      if( winIsDri
21080 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
21090 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
210a0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
210b0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
210c0 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b  8Filename(zDir);
210d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
210e0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
210f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21100 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
21110 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21120 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21130 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21140 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
21150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21160 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
21170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21180 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
21190 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
211a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
211b0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
211c0 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20  , "%s", zDir);. 
211d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
211e0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
211f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
21200 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
21210 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21220 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
21230 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21240 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
21250 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
21260 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20  ero( nMax+1 );. 
21270 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
21280 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
21290 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
212a0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
212b0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
212c0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
212d0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
212e0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
212f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
21300 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
21310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21320 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
21330 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h(.             
21340 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43     osIsNT() ? CC
21350 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
21360 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
21370 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20  WIN_A, zDir,.   
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
21390 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29  nverted, nMax+1)
213a0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
213b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
213c0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
213d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
213e0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
213f0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
21400 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
21410 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
21420 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  TH\n"));.       
21430 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
21440 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21450 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  RR_CONVPATH, (DW
21460 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
21490 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29  empname2", zDir)
214a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
214b0 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
214c0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
214d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
214e0 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
214f0 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61 74  now the candidat
21500 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73  e directory exis
21510 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  ts and should.  
21520 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73          ** be us
21530 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65  ed.  However, we
21540 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e   may need to con
21550 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  vert the string 
21560 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20  containing.     
21570 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65       ** its name
21580 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65   into UTF-8 (i.e
21590 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d 31  . if it is UTF-1
215a0 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20  6 right now)..  
215b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
215c0 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
215d0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
215e0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e  tf8Filename(zCon
215f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
21600 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
21610 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21620 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21630 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
21640 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21650 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
21660 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21670 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21680 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21690 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
216a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
216b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
216c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
216d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
216e0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
216f0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
21700 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21710 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
21720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21730 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21740 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
21750 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
21760 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21770 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
21780 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21790 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f  .#elif !SQLITE_O
217a0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
217b0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
217c0 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e    else if( osIsN
217d0 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
217e0 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57  *zMulti;.    LPW
217f0 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20  STR zWidePath = 
21800 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
21810 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57  o( nMax*sizeof(W
21820 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28  CHAR) );.    if(
21830 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20   !zWidePath ){. 
21840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21850 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
21860 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21870 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21880 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21890 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
218a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
218b0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
218c0 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  ( osGetTempPathW
218d0 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68  (nMax, zWidePath
218e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
218f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
21900 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Path);.      sql
21910 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
21920 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21930 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21940 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
21950 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
21960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
21970 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
21980 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
21990 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
219a0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
219c0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
219d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
219e0 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63  zMulti = winUnic
219f0 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
21a00 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
21a10 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ulti ){.      sq
21a20 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21a30 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
21a40 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
21a50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75  sqlite3_free(zMu
21a60 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
21a70 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
21a80 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  th);.    }else{.
21a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21aa0 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
21ab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21ac0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
21ad0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
21ae0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
21af0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
21b00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21b10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21b20 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  EM;.    }.  }.#i
21b30 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
21b40 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
21b50 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
21b60 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  f8;.    char *zM
21b70 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65  bcsPath = sqlite
21b80 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
21b90 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  x );.    if( !zM
21ba0 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20  bcsPath ){.     
21bb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21bc0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
21bd0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
21be0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
21bf0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
21c00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21c10 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
21c20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
21c30 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61  GetTempPathA(nMa
21c40 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30  x, zMbcsPath)==0
21c50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21c60 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
21c70 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21c80 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21c90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
21ca0 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
21cb0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
21cc0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
21cd0 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c  ERR_GETTEMPPATH,
21ce0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
21cf0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
21d00 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
21d10 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30  GetTempname3", 0
21d20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  );.    }.    zUt
21d30 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  f8 = sqlite3_win
21d40 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
21d50 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
21d60 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20  if( zUtf8 ){.   
21d70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21d80 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
21d90 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
21da0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21db0 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c  (zUtf8);.    }el
21dc0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
21dd0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
21de0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21df0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21e00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21e10 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
21e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21e30 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
21e40 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
21e50 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
21e60 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  SI */.#endif /* 
21e70 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
21e80 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   */..  /*.  ** C
21e90 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
21ea0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
21eb0 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77  directory ends w
21ec0 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ith an appropria
21ed0 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f  te.  ** separato
21ee0 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  r.  If it does n
21ef0 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ot and there is 
21f00 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65  not enough space
21f10 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a   left to add.  *
21f20 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a  * one, fail..  *
21f30 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65  /.  if( !winMake
21f40 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72  EndInDirSep(nDir
21f50 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20  +1, zBuf) ){.   
21f60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
21f70 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  uf);.    OSTRACE
21f80 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
21f90 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
21fa0 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
21fb0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
21fc0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
21fd0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22  winGetTempname4"
21fe0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  , 0);.  }..  /*.
21ff0 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20    ** Check that 
22000 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
22010 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
22020 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
22030 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e  ary file .  ** n
22040 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ame in the follo
22050 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  wing format:.  *
22060 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f  *.  **   "<tempo
22070 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f  rary_directory>/
22080 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58  etilqs_XXXXXXXXX
22090 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a  XXXXXX\0\0".  **
220a0 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65  .  ** If not, re
220b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
220c0 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31  R.  The number 1
220d0 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69  7 is used here i
220e0 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
220f0 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
22100 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
22110 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72  e 15 character r
22120 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64  andom suffix and
22130 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72   the.  ** two tr
22140 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61  ailing NUL chara
22150 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61  cters.  The fina
22160 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  l directory sepa
22170 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  rator character.
22180 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
22190 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73   added if it was
221a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65   not already pre
221b0 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65  sent..  */.  nLe
221c0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
221d0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28  n30(zBuf);.  if(
221e0 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20   (nLen + nPre + 
221f0 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20  17) > nBuf ){.  
22200 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22210 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
22220 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22230 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
22240 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
22250 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
22260 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
22270 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35  "winGetTempname5
22280 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ", 0);.  }..  sq
22290 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
222a0 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75  Buf-16-nLen, zBu
222b0 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54  f+nLen, SQLITE_T
222c0 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
222d0 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  ;..  j = sqlite3
222e0 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
222f0 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
22300 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
22310 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
22320 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
22330 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
22340 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
22350 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
22360 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
22370 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
22380 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
22390 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
223a0 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a   *pzBuf = zBuf;.
223b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
223c0 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d  P-FILENAME name=
223d0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %s, rc=SQLITE_OK
223e0 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
223f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22410 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
22420 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c  ed file is reall
22430 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  y a directory.  
22440 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a  Return false if.
22450 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69  ** it is somethi
22460 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
22470 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66  directory, or if
22480 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
22490 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nd of memory.** 
224a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
224b0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
224c0 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
224d0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
224e0 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  d){.  DWORD attr
224f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
22500 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
22510 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  o;..  if( osIsNT
22520 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
22530 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
22540 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
22550 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
22560 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
22570 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
22580 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
22590 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
225a0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
225b0 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
225c0 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
225d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225e0 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
225f0 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
22600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
22620 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
22630 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
22640 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
22650 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
22660 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22670 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
22680 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
22690 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
226a0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
226b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
226c0 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
226d0 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
226e0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
226f0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
22700 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
22710 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
22720 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
22730 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
22740 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
22750 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
22760 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
22770 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22780 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
22790 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
227a0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
227b0 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74   get maximum pat
227c0 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f  h name length */
227d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
227e0 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
227f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
22800 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
22810 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
22820 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
22830 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
22840 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
22850 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
22860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22870 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
22880 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
22890 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
228a0 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
228b0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
228c0 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
228d0 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
228e0 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
228f0 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
22900 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
22910 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
22920 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
22930 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
22940 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
22950 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
22960 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
22970 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
22980 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
22990 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
229a0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
229b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
229c0 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
229d0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
229e0 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
229f0 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
22a00 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
22a10 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
22a20 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
22a30 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
22a40 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
22a50 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
22a60 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
22a70 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
22a80 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
22a90 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
22aa0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
22ab0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
22ac0 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20   char *zTmpname 
22ad0 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70  = 0; /* For temp
22ae0 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20  orary filename, 
22af0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  if necessary. */
22b00 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
22b10 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
22b20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
22b30 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
22b40 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
22b50 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
22b60 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
22b70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
22b80 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
22b90 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
22ba0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
22bb0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
22bc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
22bd0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
22be0 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
22bf0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
22c00 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22c10 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
22c20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
22c30 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
22c40 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
22c50 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
22c60 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
22c70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
22c80 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
22c90 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
22ca0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22cb0 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66  WRITE);..#ifndef
22cc0 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
22cd0 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69  OpenJournal = (i
22ce0 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
22cf0 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
22d00 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
22d10 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
22d20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
22d30 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
22d40 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
22d50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
22d60 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
22d70 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
22d80 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
22d90 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
22da0 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
22db0 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
22dc0 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
22dd0 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
22de0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
22df0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
22e00 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
22e10 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
22e20 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
22e30 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
22e40 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
22e50 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
22e60 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
22e70 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
22e80 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
22e90 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
22ea0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
22eb0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
22ec0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
22ed0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
22ee0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
22ef0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
22f00 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
22f10 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
22f20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
22f30 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
22f40 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
22f50 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
22f60 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
22f70 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
22f80 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
22f90 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
22fa0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
22fb0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
22fc0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
22fd0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
22fe0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
22ff0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
23000 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
23010 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
23020 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
23030 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
23040 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
23050 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
23060 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
23070 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
23080 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
23090 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
230a0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
230b0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
230c0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
230d0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
230e0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
230f0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
23100 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
23110 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23120 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
23130 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
23140 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
23150 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
23160 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
23170 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
23180 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
23190 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
231a0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
231b0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
231c0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
231d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
231e0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
231f0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
23200 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
23210 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23220 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
23230 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23240 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
23250 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
23260 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
23270 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
23280 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23290 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
232a0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
232b0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
232c0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
232d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
232e0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
232f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
23300 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   );.  memset(pFi
23310 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  le, 0, sizeof(wi
23320 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  nFile));.  pFile
23330 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
23340 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66  NDLE_VALUE;..#if
23350 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
23360 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
23370 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65  e && !sqlite3_te
23380 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
23390 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
233a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20  SQLITE_ERROR,.  
233b0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74        "sqlite3_t
233c0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61  emp_directory va
233d0 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65  riable should be
233e0 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29   set for WinRT")
233f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
23400 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
23410 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
23420 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
23430 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
23440 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
23450 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
23460 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
23470 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
23480 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
23490 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
234a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
234b0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
234c0 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  , &zTmpname);.  
234d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
234e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
234f0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
23500 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
23510 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
23520 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
23530 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23540 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
23550 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
23560 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
23570 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
23580 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
23590 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
235a0 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
235b0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
235c0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
235d0 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
235e0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
235f0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
23600 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
23610 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
23620 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
23630 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
23640 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
23650 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e  ||.       zUtf8N
23660 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
23670 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  n30(zUtf8Name)+1
23680 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
23690 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
236a0 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
236b0 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
236c0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
236d0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
236e0 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
236f0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
23700 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rted==0 ){.    s
23710 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
23720 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
23730 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
23740 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
23750 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38  RR_NOMEM", zUtf8
23760 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23770 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
23780 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
23790 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
237a0 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
237b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
237c0 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
237d0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
237e0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
237f0 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
23800 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
23810 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38  EN_ISDIR", zUtf8
23820 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
23830 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
23840 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
23850 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
23860 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
23870 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
23880 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
23890 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
238a0 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
238b0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
238c0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
238d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
238e0 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
238f0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
23900 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
23910 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
23920 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
23930 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
23940 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
23950 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
23960 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
23970 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
23980 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
23990 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
239a0 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
239b0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
239c0 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
239d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
239e0 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
239f0 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
23a00 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
23a10 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
23a20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
23a30 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
23a40 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
23a50 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
23a60 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
23a70 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
23a80 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
23a90 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
23aa0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
23ab0 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
23ac0 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
23ad0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
23ae0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
23af0 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
23b00 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
23b10 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
23b20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
23b30 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
23b40 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
23b50 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
23b60 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
23b70 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
23b80 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
23b90 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
23ba0 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
23bb0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
23bc0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
23bd0 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bf0 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
23c00 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
23c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
23c30 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
23c40 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
23c50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
23c60 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
23c70 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
23c80 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
23c90 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
23ca0 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
23cb0 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
23cc0 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
23cd0 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
23ce0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
23cf0 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
23d00 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
23d10 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
23d20 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
23d30 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
23d40 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
23d50 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
23d60 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
23d70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
23d80 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46  INRT.    CREATEF
23d90 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
23da0 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65  RAMETERS extende
23db0 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  dParameters;.   
23dc0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
23dd0 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a  ers.dwSize = siz
23de0 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f  eof(CREATEFILE2_
23df0 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
23e00 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64  ERS);.    extend
23e10 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
23e20 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a  ileAttributes =.
23e30 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
23e40 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
23e50 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
23e60 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  E_MASK;.    exte
23e70 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
23e80 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46  wFileFlags = dwF
23e90 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
23ea0 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  s & FILE_FLAG_MA
23eb0 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
23ec0 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63  Parameters.dwSec
23ed0 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20  urityQosFlags = 
23ee0 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f  SECURITY_ANONYMO
23ef0 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  US;.    extended
23f00 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63  Parameters.lpSec
23f10 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20  urityAttributes 
23f20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65  = NULL;.    exte
23f30 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68  ndedParameters.h
23f40 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e  TemplateFile = N
23f50 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ULL;.    while( 
23f60 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
23f70 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  e2((LPCWSTR)zCon
23f80 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
23f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fa0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
23fb0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
23fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fd0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
23fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24000 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
24010 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24030 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
24040 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41  rameters))==INVA
24050 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24060 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
24090 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
240a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
240b0 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
240c0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
240d0 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
240e0 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54  ateFileW((LPCWST
240f0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24110 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
24120 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
24130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24140 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
24150 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
24160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24170 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
24180 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24190 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
241a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241b0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
241c0 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
241f0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
24200 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
24210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24220 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
24230 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
24240 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
24250 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
24260 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
24270 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
24280 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
24290 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
242a0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
242b0 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
242c0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
242d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242e0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
242f0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24310 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
24320 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
24330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24340 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
24350 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24370 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
24380 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
24390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
243a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
243b0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
243c0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
243f0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
24400 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
24410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24420 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
24430 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e    }.#endif.  win
24440 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  LogIoerr(cnt);..
24450 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24460 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
24470 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72  s, access=%lx, r
24480 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
24490 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  8Name,.         
244a0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
244b0 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  s, (h==INVALID_H
244c0 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
244d0 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
244e0 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
244f0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
24500 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
24510 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
24520 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
24530 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
24540 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
24550 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
24560 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
24570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24580 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
24590 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
245a0 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  Tmpname);.    if
245b0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
245c0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
245d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
245e0 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
245f0 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
24600 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54 45 5f   ((flags|SQLITE_
24610 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26  OPEN_READONLY) &
24620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24630 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45 5f 4f        ~(SQLITE_O
24640 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
24650 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
24660 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70 4f 75  )),.         pOu
24670 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 65 6c  tFlags);.    }el
24680 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
24690 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
246a0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
246b0 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67  ..  if( pOutFlag
246c0 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 52  s ){.    if( isR
246d0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
246e0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53    *pOutFlags = S
246f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24700 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RITE;.    }else{
24710 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
24720 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
24730 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
24740 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
24750 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
24760 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
24770 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  lx, pOutFlags=%p
24780 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25 64 2c  , *pOutFlags=%d,
24790 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 72   ".           "r
247a0 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
247b0 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  8Name, dwDesired
247c0 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c 61 67  Access, pOutFlag
247d0 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f 0a 20  s, pOutFlags ?. 
247e0 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75 74 46            *pOutF
247f0 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d 49 4e  lags : 0, (h==IN
24800 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
24810 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
24820 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20 53 51   "ok"));..#if SQ
24830 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
24840 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
24850 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  && eType==SQLITE
24860 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20  _OPEN_MAIN_DB.  
24870 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
24880 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
24890 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
248a0 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20  LITE_OK.  ){.   
248b0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
248c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
248d0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
248e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
248f0 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
24900 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d   OSTRACE(("OPEN-
24910 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c  CE-LOCK name=%s,
24920 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65   rc=%s\n", zName
24930 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
24940 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65 74 75  (rc)));.    retu
24950 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
24960 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
24970 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
24980 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
24990 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
249a0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
249b0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
249c0 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  d);.  }..  sqlit
249d0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
249e0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
249f0 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68  hod = &winIoMeth
24a00 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
24a10 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
24a20 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
24a30 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
24a40 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
24a50 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
24a60 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
24a70 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
24a80 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
24a90 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
24aa0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
24ab0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
24ac0 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
24ad0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46  E_PSOW;.  }.  pF
24ae0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
24af0 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
24b00 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
24b10 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  e;.#if SQLITE_MA
24b20 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
24b30 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
24b40 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61  LL;.  pFile->pMa
24b50 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70  pRegion = 0;.  p
24b60 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
24b70 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
24b80 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
24b90 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
24ba0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
24bb0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
24bc0 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70  ap;.#endif..  Op
24bd0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
24be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24bf0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
24c00 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
24c10 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
24c20 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
24c30 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
24c40 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
24c50 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
24c60 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
24c70 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
24c80 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
24c90 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
24ca0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
24cb0 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
24cc0 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
24cd0 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
24ce0 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
24cf0 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
24d00 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
24d10 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
24d20 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
24d30 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
24d40 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
24d50 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
24d60 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
24d70 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
24d80 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
24d90 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
24da0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
24db0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
24dc0 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
24dd0 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
24de0 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
24df0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
24e00 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
24e10 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
24e20 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
24e30 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
24e40 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
24e50 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
24e60 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
24e70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
24e80 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
24e90 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
24ec0 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
24ed0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
24ee0 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
24ef0 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
24f00 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
24f10 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
24f20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24f30 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
24f40 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
24f50 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
24f60 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
24f70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
24f80 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
24f90 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
24fa0 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20   syncDir=%d\n", 
24fb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44  zFilename, syncD
24fc0 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ir));..  zConver
24fd0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
24fe0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
24ff0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
25000 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
25010 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
25020 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
25030 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
25040 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
25050 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
25060 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
25070 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
25080 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
25090 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54    do {.#if SQLIT
250a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
250b0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
250c0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
250d0 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73  Data;.      mems
250e0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
250f0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
25100 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ta));.      if (
25110 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
25120 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72 74  utesExW(zConvert
25130 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e 66  ed, GetFileExInf
25140 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
25170 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ttrData) ){.    
25180 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
25190 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
251a0 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c  butes;.      }el
251b0 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74  se{.        last
251c0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
251d0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
251e0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
251f0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
25200 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
25210 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
25220 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
25230 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
25240 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
25250 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
25260 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
25270 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
25280 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25290 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
252a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
252b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
252c0 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72  #else.      attr
252d0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
252e0 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
252f0 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
25300 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
25310 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
25320 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
25330 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
25340 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
25350 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
25360 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
25370 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
25380 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
25390 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
253a0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
253b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
253c0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
253d0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
253e0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
253f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25400 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
25410 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
25420 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25430 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
25440 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
25450 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
25460 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25470 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
25480 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
25490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
254a0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
254b0 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43 6f  sDeleteFileW(zCo
254c0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
254d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
254e0 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
254f0 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
25500 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25510 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
25520 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
25530 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
25540 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25550 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
25560 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
25570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25580 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
25590 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  (1);.  }.#ifdef 
255a0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
255b0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
255c0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74    do {.      att
255d0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
255e0 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72  ributesA(zConver
255f0 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28  ted);.      if (
25600 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
25610 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
25620 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
25630 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
25640 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
25650 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
25660 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
25670 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
25680 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
25690 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
256a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
256b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
256c0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
256d0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
256e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
256f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25700 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
25710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
25720 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
25730 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
25740 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
25750 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
25760 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25770 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
25780 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
25790 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
257a0 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
257b0 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65  eFileA(zConverte
257c0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
257d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
257e0 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
257f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
25810 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
25820 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
25830 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
25840 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
25850 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
25860 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
25870 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25880 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
25890 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
258a0 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
258b0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
258c0 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
258d0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
258e0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
258f0 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
25900 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61  Delete", zFilena
25910 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
25920 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
25930 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
25940 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25950 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
25960 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
25970 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
25980 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
25990 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
259a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
259b0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
259c0 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
259d0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
259e0 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
259f0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
25a00 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
25a10 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
25a20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
25a30 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
25a40 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
25a50 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
25a60 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a80 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
25a90 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
25aa0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
25ab0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
25ac0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
25ad0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
25ae0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
25af0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
25b00 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
25b10 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
25b20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25b30 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
25b40 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
25b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25b60 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f  R_ACCESS; );.  O
25b70 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
25b80 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25  name=%s, flags=%
25b90 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  x, pResOut=%p\n"
25ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
25bb0 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70  lename, flags, p
25bc0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f  ResOut));..  zCo
25bd0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
25be0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
25bf0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
25c00 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
25c10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
25c20 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
25c30 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
25c40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
25c50 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
25c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
25c70 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
25c80 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
25c90 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
25ca0 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
25cb0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
25cc0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
25cd0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
25ce0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
25cf0 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
25d00 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
25d10 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
25d20 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
25d30 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
25d60 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20  foStandard, .   
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d80 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
25d90 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74  Data)) && winRet
25da0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
25db0 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
25dc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
25dd0 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
25de0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
25df0 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
25e00 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
25e10 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
25e20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
25e30 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
25e40 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
25e50 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
25e60 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
25e70 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
25e80 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
25e90 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
25ea0 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
25eb0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
25ec0 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
25ed0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
25ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25ef0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
25f00 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
25f10 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
25f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25f30 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
25f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
25f50 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
25f60 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
25f70 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
25f80 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
25f90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
25fa0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25fb0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
25fc0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
25fd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
25fe0 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
25ff0 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20  "winAccess",.   
26000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26010 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
26020 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
26030 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
26040 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
26050 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
26060 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
26070 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
26080 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
26090 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
260a0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
260b0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
260c0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
260d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
260e0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
260f0 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
26100 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
26110 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
26120 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
26130 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
26140 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
26150 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
26160 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
26170 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
26180 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
26190 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
261a0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
261b0 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
261c0 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
261d0 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
261e0 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
261f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26200 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
26210 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
26220 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
26230 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
26240 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
26250 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
26260 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%s, pResOut=%p,
26270 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
26280 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
26290 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
262a0 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ame, pResOut, *p
262b0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
262c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
262d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
262e0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
262f0 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
26300 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
26310 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a   drive letter.**
26320 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
26330 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a  olon character..
26340 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
26350 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
26360 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74  ndColon(.  const
26370 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
26380 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73  .){.  return ( s
26390 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
263a0 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
263b0 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
263c0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
263d0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
263e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
263f0 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
26400 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d  be used verbatim
26410 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  .  If.** non-zer
26420 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72  o is returned fr
26430 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
26440 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
26450 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70  nction must simp
26460 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72  ly.** use the pr
26470 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65  ovided path name
26480 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72   verbatim -OR- r
26490 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61  esolve it into a
264a0 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a   full path name.
264b0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74  ** using the Get
264c0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e  FullPathName Win
264d0 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  32 API function 
264e0 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
264f0 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
26500 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
26510 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
26520 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
26530 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
26540 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
26550 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72  ts with a forwar
26560 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63  d slash or a bac
26570 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69  kslash, it is ei
26580 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61  ther.  ** a lega
26590 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f  l UNC name, a vo
265a0 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61  lume relative pa
265b0 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  th, or an absolu
265c0 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20  te path name in 
265d0 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20  the.  ** "Unix" 
265e0 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77  format on Window
265f0 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  s.  There is no 
26600 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66  easy way to diff
26610 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
26620 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  n.  ** the final
26630 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72   two cases; ther
26640 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e  efore, we return
26650 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72   the safer retur
26660 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a  n value of TRUE.
26670 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c    ** so that cal
26680 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
26690 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c  ction will simpl
266a0 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  y use it verbati
266b0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  m..  */.  if ( w
266c0 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68  inIsDirSep(zPath
266d0 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
266e0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
266f0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
26700 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
26710 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65  rts with a lette
26720 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74  r and a colon it
26730 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c   is either a vol
26740 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ume.  ** relativ
26750 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73  e path or an abs
26760 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c  olute path.  Cal
26770 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
26780 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20  ction must not. 
26790 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74   ** attempt to t
267a0 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c  reat it as a rel
267b0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
267c0 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c  (i.e. they shoul
267d0 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a  d simply use.  *
267e0 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a  * it verbatim)..
267f0 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
26800 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
26810 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20  olon(zPathname) 
26820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
26830 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
26840 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
26850 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
26860 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
26870 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
26880 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
26890 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
268a0 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
268b0 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
268c0 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
268d0 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
268e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
268f0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
26900 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
26910 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
26920 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
26930 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
26940 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
26950 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
26960 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
26970 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
26980 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
26990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
269a0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
269b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
269c0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
269d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
269e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
269f0 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
26a00 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
26a10 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
26a20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
26a30 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a50 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
26a60 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
26a70 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
26aa0 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
26ab0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
26ac0 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
26ad0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
26ae0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
26af0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
26b00 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65  R(nFull);.  asse
26b10 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d  rt( nFull>=pVfs-
26b20 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
26b30 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
26b40 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
26b50 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
26b60 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
26b70 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
26b80 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
26b90 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
26ba0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
26bb0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
26bc0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
26bd0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
26be0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
26bf0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
26c00 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
26c10 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
26c20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
26c30 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
26c40 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
26c50 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
26c60 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
26c70 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c  rectory and a sl
26c80 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
26c90 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
26ca0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
26cb0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
26cc0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
26cd0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
26ce0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26cf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
26d00 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
26d10 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
26d20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20      (osIsNT() ? 
26d30 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
26d40 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
26d50 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20  O_WIN_A) |.     
26d60 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c 41 54         CCP_RELAT
26d70 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  IVE, zRelative, 
26d80 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61  zOut, pVfs->mxPa
26d90 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20  thname+1)<0 ){. 
26da0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26db0 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72  e(zOut);.      r
26dc0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
26dd0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
26de0 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f  N_CONVPATH, (DWO
26df0 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20  RD)errno,.      
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
26e20 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame1", zRelative
26e30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
26e40 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20      char *zUtf8 
26e50 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74  = winConvertToUt
26e60 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29  f8Filename(zOut)
26e70 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55 74  ;.      if( !zUt
26e80 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  f8 ){.        sq
26e90 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
26ea0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26eb0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26ec0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
26ed0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
26ee0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
26ef0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
26f00 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73  , zFull, "%s%c%s
26f10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
26f20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26f30 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
26f40 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
26f50 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
26f60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
26f70 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
26f80 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
26f90 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
26fa0 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
26fb0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
26fc0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
26fd0 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
26fe0 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
26ff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27000 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
27010 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
27020 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
27030 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
27040 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
27050 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
27060 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20  _TO_WIN_A),.    
27070 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76          zRelativ
27080 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
27090 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
270a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
270b0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
270c0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
270d0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
270e0 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
270f0 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
27120 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74  thname2", zRelat
27130 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
27140 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
27150 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
27160 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
27170 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
27180 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
27190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
271a0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
271b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
271c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
271d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
271e0 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
271f0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27200 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
27210 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
27220 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
27230 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
27240 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
27250 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
27260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
27270 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45  dif..#if (SQLITE
27280 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
27290 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26  ITE_OS_WINRT) &&
272a0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
272b0 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
272c0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
272d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
272e0 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e    /* WinCE has n
272f0 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72  o concept of a r
27300 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
27310 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c  , or so I am tol
27320 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54  d. */.  /* WinRT
27330 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63   has no way to c
27340 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76  onvert a relativ
27350 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73  e path to an abs
27360 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  olute one. */.  
27370 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
27380 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
27390 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
273a0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
273b0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
273c0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
273d0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
273e0 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
273f0 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
27400 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
27410 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
27420 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
27430 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
27440 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
27450 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
27460 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
27470 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
27480 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
27490 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
274a0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
274b0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63  ectory and a bac
274c0 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20  kslash..    */. 
274d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
274e0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
274f0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
27500 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73  , zFull, "%s%c%s
27510 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27530 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
27540 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
27550 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65  zRelative);.  }e
27560 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
27570 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
27580 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
27590 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
275a0 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
275b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
275c0 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
275d0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
275e0 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
275f0 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
27600 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
27610 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b  ).  DWORD nByte;
27620 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
27630 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
27640 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
27650 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
27660 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
27670 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
27680 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
27690 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
276a0 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
276b0 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
276c0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
276d0 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
276e0 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c  ' && winIsDriveL
276f0 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52  etterAndColon(zR
27700 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20  elative+1) ){.  
27710 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20    zRelative++;. 
27720 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64   }..  /* It's od
27730 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
27740 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
27750 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
27760 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
27770 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
27780 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
27790 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
277a0 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
277b0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
277c0 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
277d0 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
277e0 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
277f0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
27800 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
27810 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
27820 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
27830 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
27840 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27850 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c  OR );.  if ( sql
27860 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
27870 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
27880 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
27890 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
278a0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
278b0 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
278c0 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
278d0 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
278e0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
278f0 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
27900 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
27910 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
27920 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
27930 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
27940 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
27950 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
27960 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
27970 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
27980 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
27990 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
279a0 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
279b0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
279c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
279d0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
279e0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
279f0 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
27a20 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
27a30 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rSep(), zRelativ
27a40 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
27a50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
27a60 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
27a70 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
27a80 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  ilename(zRelativ
27a90 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
27aa0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
27ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27ac0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
27ad0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
27ae0 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
27af0 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
27b00 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
27b10 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
27b20 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rted, 0, 0, 0);.
27b30 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
27b40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27b50 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
27b60 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
27b70 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
27b80 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
27b90 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
27ba0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bc0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
27bd0 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me1", zRelative)
27be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
27bf0 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
27c00 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
27c10 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
27c20 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
27c30 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
27c40 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27c50 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
27c60 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
27c70 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
27c80 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
27c90 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
27ca0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
27cb0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
27cc0 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
27cd0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
27ce0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
27cf0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
27d00 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
27d10 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
27d20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
27d30 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
27d40 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
27d50 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
27d60 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
27d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27d80 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
27d90 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
27da0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27db0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
27dc0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  );.    zOut = wi
27dd0 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
27de0 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
27df0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
27e00 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
27e10 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
27e20 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
27e30 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
27e40 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
27e50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
27e60 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
27e70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
27e80 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
27e90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
27ea0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
27eb0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
27ec0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
27ed0 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
27ee0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
27f10 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c  Pathname3", zRel
27f20 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
27f30 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
27f40 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
27f50 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
27f60 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
27f70 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
27f80 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
27f90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
27fa0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
27fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
27fc0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
27fd0 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  }.    nByte = os
27fe0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
27ff0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
28000 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
28010 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
28020 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
28030 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28040 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
28050 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
28060 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
28070 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
28080 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
28090 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
280a0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
280b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280c0 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
280d0 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame4", zRelative
280e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
280f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28100 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
28110 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
28120 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
28130 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
28140 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
28150 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  }.#endif.  if( z
28160 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
28170 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
28180 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
28190 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
281a0 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
281b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
281c0 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
281d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
281e0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
281f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28200 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  EM;.  }.#endif.}
28210 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28220 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
28230 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
28240 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
28250 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
28260 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
28270 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
28280 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
28290 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
282a0 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
282b0 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  brary..*/./*.** 
282c0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
282d0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
282e0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
282f0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
28300 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
28310 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
28320 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
28330 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
28340 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
28350 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
28360 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
28370 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
28380 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76  .  HANDLE h;.  v
28390 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
283a0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
283b0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
283c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45  lename);.  UNUSE
283d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
283e0 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
283f0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
28400 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
28410 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
28420 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
28430 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  T.    h = osLoad
28440 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28  PackagedLibrary(
28450 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
28460 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ted, 0);.#else. 
28470 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
28480 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a  raryW((LPCWSTR)z
28490 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
284a0 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
284b0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
284c0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
284d0 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
284e0 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
284f0 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
28500 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
28510 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28520 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
28530 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
28540 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
28550 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
28560 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
28570 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
28580 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
28590 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
285a0 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
285b0 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
285c0 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
285d0 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
285e0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
285f0 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73  fs,void *pH,cons
28600 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76  t char *zSym))(v
28610 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  oid){.  UNUSED_P
28620 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
28630 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a    return (void(*
28640 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f  )(void))osGetPro
28650 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c  cAddressA((HANDL
28660 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  E)pH, zSym);.}.s
28670 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
28680 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
28690 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
286a0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
286b0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
286c0 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61  );.  osFreeLibra
286d0 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  ry((HANDLE)pHand
286e0 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
286f0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
28700 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
28710 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
28720 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
28730 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
28740 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
28750 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
28760 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
28770 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
28780 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70  ../*.** Write up
28790 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f   to nBuf bytes o
287a0 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74  f randomness int
287b0 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  o zBuf..*/.stati
287c0 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e  c int winRandomn
287d0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
287e0 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
287f0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
28800 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55  int n = 0;.  UNU
28810 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
28820 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  fs);.#if defined
28830 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
28840 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
28850 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
28860 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73  );.#else.  if( s
28870 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
28880 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
28890 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
288a0 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69     osGetSystemTi
288b0 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
288c0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
288d0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
288e0 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
288f0 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
28900 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
28910 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
28920 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
28930 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
28940 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
28950 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
28960 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  id));.    n += s
28970 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a  izeof(pid);.  }.
28980 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
28990 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  NRT.  if( sizeof
289a0 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75  (ULONGLONG)<=nBu
289b0 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47  f-n ){.    ULONG
289c0 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74  LONG cnt = osGet
289d0 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20  TickCount64();. 
289e0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
289f0 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
28a00 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
28a10 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
28a20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  }.#else.  if( si
28a30 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
28a40 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
28a50 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
28a60 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d  Count();.    mem
28a70 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
28a80 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
28a90 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
28aa0 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  f(cnt);.  }.#end
28ab0 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  if.  if( sizeof(
28ac0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
28ad0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
28ae0 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
28af0 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
28b00 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
28b10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
28b20 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f  uf[n], &i, sizeo
28b30 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(i));.    n += 
28b40 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23  sizeof(i);.  }.#
28b50 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
28b60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
28b70 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
28b80 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
28b90 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
28ba0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
28bb0 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
28bc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
28bd0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
28be0 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  .  sqlite3_win32
28bf0 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63  _sleep((microsec
28c00 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
28c10 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
28c20 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
28c30 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
28c40 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
28c50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
28c60 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
28c70 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
28c80 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
28c90 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
28ca0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
28cb0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
28cc0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
28cd0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
28ce0 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
28cf0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
28d00 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
28d10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
28d20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
28d30 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
28d40 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
28d50 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
28d60 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
28d70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
28d80 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
28d90 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
28da0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
28db0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
28dc0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
28dd0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
28de0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
28df0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
28e00 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
28e10 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
28e20 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
28e30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
28e40 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
28e50 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
28e60 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
28e70 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
28e80 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
28e90 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
28ea0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
28eb0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
28ec0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
28ed0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
28ee0 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
28ef0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
28f00 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
28f10 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
28f20 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
28f30 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
28f40 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
28f50 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
28f60 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
28f70 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
28f80 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
28f90 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
28fa0 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
28fb0 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
28fc0 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
28fd0 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
28fe0 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
28ff0 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
29000 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d   .  */.  FILETIM
29010 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
29020 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
29030 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
29040 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
29050 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
29060 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
29070 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
29080 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29090 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
290a0 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
290b0 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
290c0 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
290d0 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
290e0 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
290f0 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
29100 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
29110 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
29120 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20  x32BitValue = . 
29130 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
29140 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
29150 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
29160 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20  2000000000 +.   
29170 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
29180 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69  4)294967296;..#i
29190 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
291a0 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74  E.  SYSTEMTIME t
291b0 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74  ime;.  osGetSyst
291c0 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20  emTime(&time);. 
291d0 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d   /* if SystemTim
291e0 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61  eToFileTime() fa
291f0 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ils, it returns 
29200 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21  zero. */.  if (!
29210 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
29220 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
29230 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  )){.    return S
29240 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
29250 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
29260 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
29270 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69  me( &ft );.#endi
29280 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69  f..  *piNow = wi
29290 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b  nFiletimeEpoch +
292a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28  .            (((
292b0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
292c0 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  t.dwHighDateTime
292d0 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29  )*max32BitValue)
292e0 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
292f0 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
29300 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
29310 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
29320 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65  64)10000;..#ifde
29330 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
29340 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
29350 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
29360 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
29370 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
29380 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
29390 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
293a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
293b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
293c0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
293d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
293e0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
293f0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
29400 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
29410 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
29420 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
29430 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
29440 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
29450 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
29460 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
29470 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
29480 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
29490 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
294a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
294b0 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
294c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
294d0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
294e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
294f0 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
29500 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
29510 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
29520 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
29530 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
29540 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
29550 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29560 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
29570 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
29580 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
29590 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
295a0 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
295b0 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
295c0 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73  age() on Windows
295d0 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
295e0 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
295f0 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n Unix). After a
29600 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
29610 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
29620 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
29630 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
29640 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
29650 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
29660 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
29670 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
29680 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
29690 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
296a0 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
296b0 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
296c0 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
296d0 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
296e0 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
296f0 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
29700 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
29710 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
29720 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
29730 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
29740 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
29750 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
29760 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
29770 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
29780 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
29790 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
297a0 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
297b0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
297c0 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
297d0 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
297e0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
297f0 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
29800 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
29810 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
29820 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
29830 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
29840 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
29850 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
29860 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
29870 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
29880 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
29890 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
298a0 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
298b0 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
298c0 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
298d0 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
298e0 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
298f0 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
29900 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
29910 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
29920 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
29930 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
29940 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
29950 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
29960 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
29970 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
29980 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
29990 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
299a0 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
299b0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
299c0 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
299d0 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
299e0 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
299f0 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
29a00 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
29a10 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
29a20 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
29a30 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
29a40 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
29a50 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
29a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
29a70 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
29a80 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29a90 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
29aa0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
29ab0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29ac0 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65  ;.  return winGe
29ad0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
29ae0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
29af0 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a  nBuf, zBuf);.}..
29b00 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
29b10 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
29b20 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
29b30 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
29b40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29b50 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
29b60 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
29b70 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
29b80 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
29b90 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
29ba0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
29bb0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
29bc0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
29bd0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
29be0 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
29bf0 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
29c00 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
29c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
29c20 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
29c30 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
29c40 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
29c50 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
29c60 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
29c70 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29c90 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
29ca0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
29cb0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
29cc0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
29cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
29ce0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
29cf0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
29d00 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
29d10 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
29d20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
29d30 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
29d40 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
29d50 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
29d60 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
29d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29d80 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
29d90 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
29da0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
29db0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
29dc0 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
29dd0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
29de0 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
29df0 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
29e00 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
29e10 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
29e20 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
29e30 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
29e40 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
29e50 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
29e60 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
29e70 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
29e80 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
29e90 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
29ea0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
29eb0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
29ec0 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
29ed0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
29ee0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
29ef0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
29f00 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
29f10 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20  all */.  };.#if 
29f20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
29f30 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
29f40 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
29f50 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56  vfs winLongPathV
29f60 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
29f90 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
29fa0 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
29fb0 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
29fc0 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
29fd0 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
29fe0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a000 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2a010 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74    "win32-longpat
2a020 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  h",    /* zName 
2a030 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2a040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2a050 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
2a060 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
2a070 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2a080 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2a090 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2a0a0 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2a0b0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2a0c0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2a0d0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2a0e0 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2a0f0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2a100 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2a110 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2a120 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2a130 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2a140 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2a150 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2a160 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2a170 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2a180 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2a190 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
2a1a0 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
2a1b0 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2a1c0 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a1e0 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2a1f0 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2a200 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2a210 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2a220 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
2a230 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2a240 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2a250 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
2a260 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2a270 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2a280 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2a290 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2a2a0 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2a2b0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
2a2c0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2a2d0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2a2e0 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
2a2f0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2a300 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  };.#endif..  /* 
2a310 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
2a320 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
2a330 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
2a340 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
2a350 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
2a360 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
2a370 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
2a380 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
2a390 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 36  ze(aSyscall)==76
2a3a0 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65   );..  /* get me
2a3b0 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
2a3c0 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
2a3d0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
2a3e0 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
2a3f0 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
2a400 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
2a410 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74  WINRT.  osGetNat
2a420 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  iveSystemInfo(&w
2a430 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73  inSysInfo);.#els
2a440 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  e.  osGetSystemI
2a450 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
2a460 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
2a470 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
2a480 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
2a490 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73  arity>0 );.  ass
2a4a0 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
2a4b0 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a  dwPageSize>0 );.
2a4c0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
2a4d0 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
2a4e0 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65   1);..#if define
2a4f0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2a500 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74  AS_WIDE).  sqlit
2a510 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
2a520 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c  &winLongPathVfs,
2a530 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72   0);.#endif..  r
2a540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a550 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
2a560 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
2a570 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2a580 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f  NRT.  if( sleepO
2a590 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  bj!=NULL ){.    
2a5a0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c  osCloseHandle(sl
2a5b0 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65  eepObj);.    sle
2a5c0 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  epObj = NULL;.  
2a5d0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2a5e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2a5f0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2a600 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.