/ Hex Artifact Content
Login

Artifact 6c4752b58c0b795ef9c2ea667b7ea0966937a796:


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 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 49 73 20 74 68 65 20 4f 53  ./*.** Is the OS
02c0: 54 52 41 43 45 20 6d 61 63 72 6f 20 64 65 66 69  TRACE macro defi
02d0: 6e 65 64 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ned to actually 
02e0: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 3f 0a 2a 2f  do something?.*/
02f0: 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 53 51  .#if (defined(SQ
0300: 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 53  LITE_DEBUG) && S
0310: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20 7c 7c  QLITE_OS_WIN) ||
0320: 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28   \.    (defined(
0330: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20  SQLITE_TEST) || 
0340: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46  defined(SQLITE_F
0350: 4f 52 43 45 5f 4f 53 5f 54 52 41 43 45 29 29 0a  ORCE_OS_TRACE)).
0360: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0370: 5f 57 49 4e 33 32 5f 48 41 53 5f 4f 53 5f 54 52  _WIN32_HAS_OS_TR
0380: 41 43 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ACE.#endif../*.*
0390: 2a 20 43 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20  * Compiling and 
03a0: 75 73 69 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72  using WAL mode r
03b0: 65 71 75 69 72 65 73 20 73 65 76 65 72 61 6c 20  equires several 
03c0: 41 50 49 73 20 74 68 61 74 20 61 72 65 20 6f 6e  APIs that are on
03d0: 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ly.** available 
03e0: 69 6e 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  in Windows platf
03f0: 6f 72 6d 73 20 62 61 73 65 64 20 6f 6e 20 74 68  orms based on th
0400: 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a  e NT kernel..*/.
0410: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
0420: 49 4e 4e 54 20 26 26 20 21 64 65 66 69 6e 65 64  INNT && !defined
0430: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
0440: 29 0a 23 20 20 65 72 72 6f 72 20 22 57 41 4c 20  ).#  error "WAL 
0450: 6d 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 75  mode requires su
0460: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 57  pport from the W
0470: 69 6e 64 6f 77 73 20 4e 54 20 6b 65 72 6e 65 6c  indows NT kernel
0480: 2c 20 63 6f 6d 70 69 6c 65 5c 0a 20 77 69 74 68  , compile\. with
0490: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
04a0: 2e 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .".#endif..#if !
04b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20  SQLITE_OS_WINNT 
04c0: 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  && SQLITE_MAX_MM
04d0: 41 50 5f 53 49 5a 45 3e 30 0a 23 20 20 65 72 72  AP_SIZE>0.#  err
04e0: 6f 72 20 22 4d 65 6d 6f 72 79 20 6d 61 70 70 65  or "Memory mappe
04f0: 64 20 66 69 6c 65 73 20 72 65 71 75 69 72 65 20  d files require 
0500: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
0510: 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b 65 72 6e   Windows NT kern
0520: 65 6c 2c 5c 0a 20 63 6f 6d 70 69 6c 65 20 77 69  el,\. compile wi
0530: 74 68 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  th SQLITE_MAX_MM
0540: 41 50 5f 53 49 5a 45 3d 30 2e 22 0a 23 65 6e 64  AP_SIZE=0.".#end
0550: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f  if../*.** Are mo
0560: 73 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20  st of the Win32 
0570: 41 4e 53 49 20 41 50 49 73 20 61 76 61 69 6c 61  ANSI APIs availa
0580: 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68 20 63  ble (i.e. with c
0590: 65 72 74 61 69 6e 20 65 78 63 65 70 74 69 6f 6e  ertain exception
05a0: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
05b0: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 29 3f  e sub-platform)?
05c0: 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .*/.#if !SQLITE_
05d0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
05e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
05f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0600: 57 49 4e 33 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23  WIN32_NO_ANSI).#
0610: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0620: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 23  WIN32_HAS_ANSI.#
0630: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
0640: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
0650: 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73 20  32 Unicode APIs 
0660: 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20  available (i.e. 
0670: 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63  with certain exc
0680: 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64  eptions.** based
0690: 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74   on the sub-plat
06a0: 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 28 53  form)?.*/.#if (S
06b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
06c0: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
06d0: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
06e0: 49 4e 52 54 29 20 26 26 20 5c 0a 20 20 20 20 21  INRT) && \.    !
06f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
0700: 49 4e 33 32 5f 4e 4f 5f 57 49 44 45 29 0a 23 20  IN32_NO_WIDE).# 
0710: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0720: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 0a 23 65  IN32_HAS_WIDE.#e
0730: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
0740: 20 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f   sure at least o
0750: 6e 65 20 73 65 74 20 6f 66 20 57 69 6e 33 32 20  ne set of Win32 
0760: 41 50 49 73 20 69 73 20 61 76 61 69 6c 61 62 6c  APIs is availabl
0770: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
0780: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
0790: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
07a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
07b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 20  32_HAS_WIDE).#  
07c0: 65 72 72 6f 72 20 22 41 74 20 6c 65 61 73 74 20  error "At least 
07d0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 57 49  one of SQLITE_WI
07e0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 61 6e 64  N32_HAS_ANSI and
07f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
0800: 53 5f 57 49 44 45 5c 0a 20 6d 75 73 74 20 62 65  S_WIDE\. must be
0810: 20 64 65 66 69 6e 65 64 2e 22 0a 23 65 6e 64 69   defined.".#endi
0820: 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  f../*.** Define 
0830: 74 68 65 20 72 65 71 75 69 72 65 64 20 57 69 6e  the required Win
0840: 64 6f 77 73 20 53 44 4b 20 76 65 72 73 69 6f 6e  dows SDK version
0850: 20 63 6f 6e 73 74 61 6e 74 73 20 69 66 20 74 68   constants if th
0860: 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c  ey are not.** al
0870: 72 65 61 64 79 20 61 76 61 69 6c 61 62 6c 65 2e  ready available.
0880: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 54 44 44  .*/.#ifndef NTDD
0890: 49 5f 57 49 4e 38 0a 23 20 20 64 65 66 69 6e 65  I_WIN8.#  define
08a0: 20 4e 54 44 44 49 5f 57 49 4e 38 20 20 20 20 20   NTDDI_WIN8     
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 30 78 30 36 30 32 30 30 30 30 0a 23 65     0x06020000.#e
08d0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e 54  ndif..#ifndef NT
08e0: 44 44 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20 64  DDI_WINBLUE.#  d
08f0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 42  efine NTDDI_WINB
0900: 4c 55 45 20 20 20 20 20 20 20 20 20 20 20 20 20  LUE             
0910: 20 20 20 20 20 20 20 20 30 78 30 36 30 33 30 30          0x060300
0920: 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  00.#endif../*.**
0930: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
0940: 20 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45   the GetVersionE
0950: 78 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20  x[AW] functions 
0960: 61 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f  are deprecated o
0970: 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20  n the.** target 
0980: 73 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73  system.  GetVers
0990: 69 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20  ionEx was first 
09a0: 64 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69  deprecated in Wi
09b0: 6e 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  n8.1..*/.#ifndef
09c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
09d0: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66  TVERSIONEX.#  if
09e0: 20 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56   defined(NTDDI_V
09f0: 45 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49  ERSION) && NTDDI
0a00: 5f 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44  _VERSION >= NTDD
0a10: 49 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64  I_WINBLUE.#    d
0a20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
0a30: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20  32_GETVERSIONEX 
0a40: 20 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73    0   /* GetVers
0a50: 69 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65  ionEx() is depre
0a60: 63 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65  cated */.#  else
0a70: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
0a80: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
0a90: 53 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20  SIONEX   1   /* 
0aa0: 47 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69  GetVersionEx() i
0ab0: 73 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20  s current */.#  
0ac0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
0ad0: 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74 61 6e  .** This constan
0ae0: 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  t should already
0af0: 20 62 65 20 64 65 66 69 6e 65 64 20 28 69 6e 20   be defined (in 
0b00: 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22 20 53  the "WinDef.h" S
0b10: 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69 66  DK file)..*/.#if
0b20: 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a 23 20  ndef MAX_PATH.# 
0b30: 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48   define MAX_PATH
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 20 28 32 36 30 29 0a 23 65 6e 64        (260).#end
0b60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75  if../*.** Maximu
0b70: 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74  m pathname lengt
0b80: 68 20 28 69 6e 20 63 68 61 72 73 29 20 66 6f 72  h (in chars) for
0b90: 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20 73 68   Win32.  This sh
0ba0: 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
0bb0: 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a 2a 2f  .** MAX_PATH..*/
0bc0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0bd0: 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43  WIN32_MAX_PATH_C
0be0: 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53  HARS.#  define S
0bf0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0c00: 50 41 54 48 5f 43 48 41 52 53 20 20 20 28 4d 41  PATH_CHARS   (MA
0c10: 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66 0a 0a  X_PATH).#endif..
0c20: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0c30: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ant should alrea
0c40: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69  dy be defined (i
0c50: 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68 22 20  n the "WinNT.h" 
0c60: 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23 69  SDK file)..*/.#i
0c70: 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f 53 54  fndef UNICODE_ST
0c80: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 0a 23  RING_MAX_CHARS.#
0c90: 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f 44 45    define UNICODE
0ca0: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0cb0: 53 20 20 20 20 20 20 28 33 32 37 36 37 29 0a 23  S      (32767).#
0cc0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  endif../*.** Max
0cd0: 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65  imum pathname le
0ce0: 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20  ngth (in chars) 
0cf0: 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73  for WinNT.  This
0d00: 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
0d10: 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f 53   be.** UNICODE_S
0d20: 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 2e  TRING_MAX_CHARS.
0d30: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0d40: 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
0d50: 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e  H_CHARS.#  defin
0d60: 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d  e SQLITE_WINNT_M
0d70: 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20  AX_PATH_CHARS   
0d80: 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f  (UNICODE_STRING_
0d90: 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e 64 69  MAX_CHARS).#endi
0da0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
0db0: 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68   pathname length
0dc0: 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f 72 20   (in bytes) for 
0dd0: 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41 58 5f  Win32.  The MAX_
0de0: 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20 69 6e  PATH macro is in
0df0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20  .** characters, 
0e00: 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65 20 34  so we allocate 4
0e10: 20 62 79 74 65 73 20 70 65 72 20 63 68 61 72 61   bytes per chara
0e20: 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20 77 6f  cter assuming wo
0e30: 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a 20 34  rst-case of.** 4
0e40: 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61 72 61  -bytes-per-chara
0e50: 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e 0a 2a  cter for UTF8..*
0e60: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
0e70: 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
0e80: 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65 20  BYTES.#  define 
0e90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
0ea0: 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 28 53  _PATH_BYTES   (S
0eb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0ec0: 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a 23 65  PATH_CHARS*4).#e
0ed0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0ee0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0ef0: 67 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66  gth (in bytes) f
0f00: 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69 73 20  or WinNT.  This 
0f10: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0f20: 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f 53 54  be.** UNICODE_ST
0f30: 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53 20 2a  RING_MAX_CHARS *
0f40: 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29 2e 0a   sizeof(WCHAR)..
0f50: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0f60: 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
0f70: 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e 65  _BYTES.#  define
0f80: 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
0f90: 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20 5c  X_PATH_BYTES   \
0fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69               (si
0fc0: 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20 53 51  zeof(WCHAR) * SQ
0fd0: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0fe0: 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e 64 69  ATH_CHARS).#endi
0ff0: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d  f../*.** Maximum
1000: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6c   error message l
1010: 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73 29  ength (in chars)
1020: 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f 0a 23   for WinRT..*/.#
1030: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1040: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
1050: 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65 20 53  HARS.#  define S
1060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
1070: 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28 31 30  ERRMSG_CHARS (10
1080: 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  24).#endif../*.*
1090: 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
10a0: 72 6f 20 69 66 20 74 68 65 20 63 68 61 72 61 63  ro if the charac
10b0: 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20 74 72  ter should be tr
10c0: 65 61 74 65 64 20 61 73 20 61 20 64 69 72 65 63  eated as a direc
10d0: 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61 74 6f  tory.** separato
10e0: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69  r..*/.#ifndef wi
10f0: 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64 65 66  nIsDirSep.#  def
1100: 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65 70 28  ine winIsDirSep(
1110: 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a)              
1120: 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27 29 20    (((a) == '/') 
1130: 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c 27 29  || ((a) == '\\')
1140: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1150: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
1160: 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61 6c 20  ed when a local 
1170: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
1180: 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74 20  to a value that 
1190: 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d 65 73  is.** [sometimes
11a0: 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  ] not used by th
11b0: 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76 69 61  e code (e.g. via
11c0: 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63 6f 6d   conditional com
11d0: 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a 23 69  pilation)..*/.#i
11e0: 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56 41 52  fndef UNUSED_VAR
11f0: 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20 20 64  IABLE_VALUE.#  d
1200: 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56 41 52  efine UNUSED_VAR
1210: 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29 20 20  IABLE_VALUE(x)  
1220: 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a 23 65      (void)(x).#e
1230: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1240: 72 6e 73 20 74 68 65 20 63 68 61 72 61 63 74 65  rns the characte
1250: 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  r that should be
1260: 20 75 73 65 64 20 61 73 20 74 68 65 20 64 69 72   used as the dir
1270: 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
1280: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77 69 6e  ..*/.#ifndef win
1290: 47 65 74 44 69 72 53 65 70 0a 23 20 20 64 65 66  GetDirSep.#  def
12a0: 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53 65 70  ine winGetDirSep
12b0: 28 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ()              
12c0: 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a 0a 2f    '\\'.#endif../
12d0: 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20  *.** Do we need 
12e0: 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69  to manually defi
12f0: 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c  ne the Win32 fil
1300: 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66  e mapping APIs f
1310: 6f 72 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a  or use with WAL.
1320: 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d 6f 72  ** mode or memor
1330: 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 28  y mapped files (
1340: 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 73 20  e.g. these APIs 
1350: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  are available in
1360: 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a 2a 20   the Windows.** 
1370: 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c  CE SDK; however,
1380: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 70 72   they are not pr
1390: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 65 61  esent in the hea
13a0: 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69  der file)?.*/.#i
13b0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  f SQLITE_WIN32_F
13c0: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 26  ILEMAPPING_API &
13d0: 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65  & \.        (!de
13e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13f0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
1400: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1410: 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20 74  )./*.** Two of t
1420: 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20  he file mapping 
1430: 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72 65  APIs are differe
1440: 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e 20  nt under WinRT. 
1450: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
1460: 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65 64  h.** set we need
1470: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1480: 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53 45  OS_WINRT.WINBASE
1490: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
14a0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
14b0: 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c  ingFromApp(HANDL
14c0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
14d0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
14e0: 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47  ES, ULONG, ULONG
14f0: 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a 57  64, LPCWSTR);..W
1500: 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44  INBASEAPI LPVOID
1510: 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f   WINAPI MapViewO
1520: 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41 4e  fFileFromApp(HAN
1530: 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e  DLE, ULONG, ULON
1540: 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65  G64, SIZE_T);.#e
1550: 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64 28  lse.#if defined(
1560: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1570: 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41 50  _ANSI).WINBASEAP
1580: 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20  I HANDLE WINAPI 
1590: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
15a0: 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43  gA(HANDLE, LPSEC
15b0: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
15c0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
15d0: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
15e0: 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69 66   LPCSTR);.#endif
15f0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
1600: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1610: 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  I) */..#if defin
1620: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1630: 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41 53  HAS_WIDE).WINBAS
1640: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
1650: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
1660: 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c 50  pingW(HANDLE, LP
1670: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
1680: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
1690: 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f  WORD, DWORD, DWO
16a0: 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23 65  RD, LPCWSTR);.#e
16b0: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
16c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
16d0: 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42 41  _WIDE) */..WINBA
16e0: 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e  SEAPI LPVOID WIN
16f0: 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c  API MapViewOfFil
1700: 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44 2c  e(HANDLE, DWORD,
1710: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 53   DWORD, DWORD, S
1720: 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20 2f  IZE_T);.#endif /
1730: 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  * SQLITE_OS_WINR
1740: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  T */../*.** This
1750: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50   file mapping AP
1760: 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 62  I is common to b
1770: 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57 69  oth Win32 and Wi
1780: 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45 41  nRT..*/.WINBASEA
1790: 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55  PI BOOL WINAPI U
17a0: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c  nmapViewOfFile(L
17b0: 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20  PCVOID);.#endif 
17c0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
17d0: 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20  FILEMAPPING_API 
17e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
17f0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
1800: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
1810: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
1820: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
1830: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
1840: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
1850: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
1860: 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a  WORD)-1).#endif.
1870: 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c  .#ifndef FILE_FL
1880: 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65  AG_MASK.# define
1890: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20   FILE_FLAG_MASK 
18a0: 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43           (0xFF3C
18b0: 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69  0000).#endif..#i
18c0: 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49  fndef FILE_ATTRI
18d0: 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69  BUTE_MASK.# defi
18e0: 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ne FILE_ATTRIBUT
18f0: 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30  E_MASK     (0x00
1900: 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a  03FFF7).#endif..
1910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1920: 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61  MIT_WAL./* Forwa
1930: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
1940: 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
1950: 20 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65   for WAL */.type
1960: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
1970: 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20  m winShm;       
1980: 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74      /* A connect
1990: 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
19a0: 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20  mory */.typedef 
19b0: 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
19c0: 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20  e winShmNode;   
19d0: 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73  /* A region of s
19e0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
19f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69  #endif../*.** Wi
1a00: 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65  nCE lacks native
1a10: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c   support for fil
1a20: 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20  e locking so we 
1a30: 68 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a  have to fake it.
1a40: 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64  ** with some cod
1a50: 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f  e of our own..*/
1a60: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1a70: 49 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72  INCE.typedef str
1a80: 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a  uct winceLock {.
1a90: 20 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20    int nReaders; 
1aa0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1ab0: 6f 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20  of reader locks 
1ac0: 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f  obtained */.  BO
1ad0: 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20  OL bPending;    
1ae0: 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61    /* Indicates a
1af0: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
1b00: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
1b10: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72  */.  BOOL bReser
1b20: 76 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69  ved;     /* Indi
1b30: 63 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64  cates a reserved
1b40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
1b50: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1b60: 4c 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20  L bExclusive;   
1b70: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e   /* Indicates an
1b80: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1b90: 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  has been obtaine
1ba0: 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b  d */.} winceLock
1bb0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
1bc0: 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75  The winFile stru
1bd0: 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c  cture is a subcl
1be0: 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66  ass of sqlite3_f
1bf0: 69 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f  ile* specific to
1c00: 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f   the win32.** po
1c10: 72 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e  rtability layer.
1c20: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1c30: 63 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69  ct winFile winFi
1c40: 6c 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69  le;.struct winFi
1c50: 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  le {.  const sql
1c60: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1c70: 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d  *pMethod; /*** M
1c80: 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a  ust be first ***
1c90: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1ca0: 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54  *pVfs;      /* T
1cb0: 68 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f  he VFS used to o
1cc0: 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  pen this file */
1cd0: 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20  .  HANDLE h;    
1ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1cf0: 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69  ndle for accessi
1d00: 6e 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  ng the file */. 
1d10: 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20   u8 locktype;   
1d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
1d30: 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74   of lock current
1d40: 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20  ly held on this 
1d50: 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20  file */.  short 
1d60: 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20  sharedLockByte; 
1d70: 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68    /* Randomly ch
1d80: 6f 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61  osen byte used a
1d90: 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  s a shared lock 
1da0: 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67  */.  u8 ctrlFlag
1db0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
1dc0: 46 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46  Flags.  See WINF
1dd0: 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20  ILE_* below */. 
1de0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
1df0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
1e00: 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72  Windows errno fr
1e10: 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20  om the last I/O 
1e20: 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66  error */.#ifndef
1e30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e40: 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b  .  winShm *pShm;
1e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e60: 73 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64  stance of shared
1e70: 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20   memory on this 
1e80: 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
1e90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1ea0: 74 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c  th;      /* Full
1eb0: 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69   pathname of thi
1ec0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
1ed0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1ee0: 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a      /* Chunk siz
1ef0: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  e configured by 
1f00: 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
1f10: 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
1f20: 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52  S_WINCE.  LPWSTR
1f30: 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b   zDeleteOnClose;
1f40: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
1f50: 65 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e  e to delete when
1f60: 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41   closing */.  HA
1f70: 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20  NDLE hMutex;    
1f80: 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75        /* Mutex u
1f90: 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61  sed to control a
1fa0: 63 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20  ccess to shared 
1fb0: 6c 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  lock */.  HANDLE
1fc0: 20 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20   hShared;       
1fd0: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1fe0: 72 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20  ry segment used 
1ff0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  for locking */. 
2000: 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c   winceLock local
2010: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b  ;        /* Lock
2020: 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68  s obtained by th
2030: 69 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77  is instance of w
2040: 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63  inFile */.  winc
2050: 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20  eLock *shared;  
2060: 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68      /* Global sh
2070: 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79  ared lock memory
2080: 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a   for the file  *
2090: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
20a0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
20b0: 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68  E>0.  int nFetch
20c0: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
20d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20e0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
20f0: 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a  tch references *
2100: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b  /.  HANDLE hMap;
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20    /* Handle for 
2130: 61 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79  accessing memory
2140: 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f   mapping */.  vo
2150: 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20  id *pMapRegion; 
2160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2170: 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  rea memory mappe
2180: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
2190: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20  nt64 mmapSize;  
21a0: 20 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73       /* Usable s
21b0: 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65  ize of mapped re
21c0: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
21d0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
21e0: 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61  Actual; /* Actua
21f0: 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64  l size of mapped
2200: 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c   region */.  sql
2210: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
2220: 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f  izeMax;    /* Co
2230: 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d  nfigured FCNTL_M
2240: 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a  MAP_SIZE value *
2250: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
2260: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
2270: 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74  s for winFile.ct
2280: 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69  rlFlags.*/.#defi
2290: 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  ne WINFILE_RDONL
22a0: 59 20 20 20 20 20 20 20 20 20 20 30 78 30 32 20  Y          0x02 
22b0: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
22c0: 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a  is read only */.
22d0: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
22e0: 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20  PERSIST_WAL     
22f0: 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73  0x04   /* Persis
2300: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
2310: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
2320: 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20 20 20  _PSOW           
2330: 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49 54   0x10   /* SQLIT
2340: 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
2350: 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a  E_OVERWRITE */..
2360: 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*. * The size o
2370: 66 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65  f the buffer use
2380: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69 6e  d by sqlite3_win
2390: 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 29  32_write_debug()
23a0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
23b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
23c0: 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e  UF_SIZE.#  defin
23d0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  e SQLITE_WIN32_D
23e0: 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28 28  BG_BUF_SIZE   ((
23f0: 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f 66  int)(4096-sizeof
2400: 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69 66  (DWORD))).#endif
2410: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75  ../*. * The valu
2420: 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
2430: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
2440: 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65  rectory() to spe
2450: 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65  cify that. * the
2460: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
2470: 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65  should be change
2480: 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  d.. */.#ifndef S
2490: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
24a0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
24b0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
24c0: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
24d0: 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a 23  CTORY_TYPE (1).#
24e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
24f0: 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68   value used with
2500: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
2510: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74  et_directory() t
2520: 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20  o specify that. 
2530: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
2540: 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64  directory should
2550: 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f   be changed.. */
2560: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2570: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
2580: 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66  TORY_TYPE.#  def
2590: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
25a0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
25b0: 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66 0a  TYPE (2).#endif.
25c0: 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c  ./*. * If compil
25d0: 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57  ed with SQLITE_W
25e0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57  IN32_MALLOC on W
25f0: 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20  indows, we will 
2600: 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f  use the. * vario
2610: 75 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61  us Win32 API hea
2620: 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74  p functions inst
2630: 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a  ead of our own..
2640: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2650: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a  E_WIN32_MALLOC..
2660: 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69 73  /*. * If this is
2670: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73   non-zero, an is
2680: 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c  olated heap will
2690: 20 62 65 20 63 72 65 61 74 65 64 20 62 79 20 74   be created by t
26a0: 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32 0a  he native Win32.
26b0: 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62   * allocator sub
26c0: 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69 73  system; otherwis
26d0: 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  e, the default p
26e0: 72 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c 6c  rocess heap will
26f0: 20 62 65 20 75 73 65 64 2e 20 20 54 68 69 73 0a   be used.  This.
2700: 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20 6e   * setting has n
2710: 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20 63 6f  o effect when co
2720: 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52  mpiling for WinR
2730: 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20  T.  By default, 
2740: 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64 0a  this is enabled.
2750: 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74   * and an isolat
2760: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
2770: 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65  created to store
2780: 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64   all allocated d
2790: 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a  ata.. *. *******
27a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e0: 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49  *******. * WARNI
27f0: 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  NG: It is import
2800: 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61 74  ant to note that
2810: 20 77 68 65 6e 20 74 68 69 73 20 73 65 74 74 69   when this setti
2820: 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  ng is non-zero a
2830: 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20  nd the. *       
2840: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
2850: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  n function is ca
2860: 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74 68  lled (e.g. by th
2870: 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  e sqlite3_shutdo
2880: 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20 66  wn. *          f
2890: 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61  unction), all da
28a0: 74 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f  ta that was allo
28b0: 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  cated using the 
28c0: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
28d0: 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20 62  ll. *          b
28e0: 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61 74  e freed immediat
28f0: 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74 65  ely and any atte
2900: 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20 61 6e  mpt to access an
2910: 79 20 6f 66 20 74 68 61 74 20 66 72 65 65 64 0a  y of that freed.
2920: 20 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61   *          data
2930: 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72   will almost cer
2940: 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e  tainly result in
2950: 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61 63   an immediate ac
2960: 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  cess violation..
2970: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
29c0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
29d0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
29e0: 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20 53  EATE.#  define S
29f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2a00: 5f 43 52 45 41 54 45 20 20 20 20 28 54 52 55 45  _CREATE    (TRUE
2a10: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2a20: 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65  The initial size
2a30: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70   of the Win32-sp
2a40: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68  ecific heap.  Th
2a50: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  is value may be 
2a60: 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  zero.. */.#ifnde
2a70: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
2a80: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20  EAP_INIT_SIZE.# 
2a90: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2aa0: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
2ab0: 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46  IZE ((SQLITE_DEF
2ac0: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
2ad0: 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   * \.           
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
2b00: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2b10: 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34  _SIZE) + 4194304
2b20: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2b30: 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  The maximum size
2b40: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70   of the Win32-sp
2b50: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68  ecific heap.  Th
2b60: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  is value may be 
2b70: 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  zero.. */.#ifnde
2b80: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
2b90: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20  EAP_MAX_SIZE.#  
2ba0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2bb0: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
2bc0: 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f  E  (0).#endif../
2bd0: 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66  *. * The extra f
2be0: 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63  lags to use in c
2bf0: 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33  alls to the Win3
2c00: 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68  2 heap APIs.  Th
2c10: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a  is value may be.
2c20: 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20   * zero for the 
2c30: 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72  default behavior
2c40: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2c50: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2c60: 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20  FLAGS.#  define 
2c70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2c80: 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a  P_FLAGS     (0).
2c90: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
2ca0: 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74  he winMemData st
2cb0: 72 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69  ructure stores i
2cc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69  nformation requi
2cd0: 72 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32  red by the Win32
2ce0: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c  -specific.** sql
2cf0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
2d00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
2d10: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2d20: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
2d30: 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74  nMemData;.struct
2d40: 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69   winMemData {.#i
2d50: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75  fndef NDEBUG.  u
2d60: 33 32 20 6d 61 67 69 63 31 3b 20 20 20 2f 2a 20  32 magic1;   /* 
2d70: 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20  Magic number to 
2d80: 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65  detect structure
2d90: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a   corruption. */.
2da0: 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20  #endif.  HANDLE 
2db0: 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61  hHeap; /* The ha
2dc0: 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70  ndle to our heap
2dd0: 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e  . */.  BOOL bOwn
2de0: 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77  ed;  /* Do we ow
2df0: 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e  n the heap (i.e.
2e00: 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73   destroy it on s
2e10: 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66  hutdown)? */.#if
2e20: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33  ndef NDEBUG.  u3
2e30: 32 20 6d 61 67 69 63 32 3b 20 20 20 2f 2a 20 4d  2 magic2;   /* M
2e40: 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64  agic number to d
2e50: 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20  etect structure 
2e60: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23  corruption. */.#
2e70: 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65  endif.};..#ifnde
2e80: 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65  f NDEBUG.#define
2e90: 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 20   WINMEM_MAGIC1  
2ea0: 20 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 64     0x42b2830b.#d
2eb0: 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47  efine WINMEM_MAG
2ec0: 49 43 32 20 20 20 20 20 30 78 62 64 34 64 37 63  IC2     0xbd4d7c
2ed0: 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  f4.#endif..stati
2ee0: 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  c struct winMemD
2ef0: 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  ata win_mem_data
2f00: 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45   = {.#ifndef NDE
2f10: 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47  BUG.  WINMEM_MAG
2f20: 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55  IC1,.#endif.  NU
2f30: 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66 6e 64 65  LL, FALSE.#ifnde
2f40: 66 20 4e 44 45 42 55 47 0a 20 20 2c 57 49 4e 4d  f NDEBUG.  ,WINM
2f50: 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e 64 69 66  EM_MAGIC2.#endif
2f60: 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .};..#ifndef NDE
2f70: 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  BUG.#define winM
2f80: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29  emAssertMagic1()
2f90: 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d   assert( win_mem
2fa0: 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d 3d 57 49  _data.magic1==WI
2fb0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 0a 23 64  NMEM_MAGIC1 ).#d
2fc0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2fd0: 72 74 4d 61 67 69 63 32 28 29 20 61 73 73 65 72  rtMagic2() asser
2fe0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
2ff0: 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic2==WINMEM_M
3000: 41 47 49 43 32 20 29 0a 23 64 65 66 69 6e 65 20  AGIC2 ).#define 
3010: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
3020: 63 28 29 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  c()  winMemAsser
3030: 74 4d 61 67 69 63 31 28 29 3b 20 77 69 6e 4d 65  tMagic1(); winMe
3040: 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 3b  mAssertMagic2();
3050: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77  .#else.#define w
3060: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3070: 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  ().#endif..#defi
3080: 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44 61 74 61  ne winMemGetData
3090: 50 74 72 28 29 20 20 26 77 69 6e 5f 6d 65 6d 5f  Ptr()  &win_mem_
30a0: 64 61 74 61 0a 23 64 65 66 69 6e 65 20 77 69 6e  data.#define win
30b0: 4d 65 6d 47 65 74 48 65 61 70 28 29 20 20 20 20  MemGetHeap()    
30c0: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48   win_mem_data.hH
30d0: 65 61 70 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  eap.#define winM
30e0: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 20 20 20  emGetOwned()    
30f0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 62 4f 77  win_mem_data.bOw
3100: 6e 65 64 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ned..static void
3110: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
3120: 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74  nt nBytes);.stat
3130: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
3140: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
3150: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  ;.static void *w
3160: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
3170: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
3180: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69  Bytes);.static i
3190: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
31a0: 69 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69  id *p);.static i
31b0: 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70  nt winMemRoundup
31c0: 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20  (int n);.static 
31d0: 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76  int winMemInit(v
31e0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a  oid *pAppData);.
31f0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
3200: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
3210: 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e  *pAppData);..con
3220: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
3230: 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d  ethods *sqlite3M
3240: 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29  emGetWin32(void)
3250: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
3260: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
3270: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  */../*.** The fo
3280: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
3290: 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73   is (normally) s
32a0: 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65  et once and neve
32b0: 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65  r changes.** the
32c0: 72 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63  reafter.  It rec
32d0: 6f 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65  ords whether the
32e0: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
32f0: 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72  m is Win9x.** or
3300: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a   WinNT..**.** 0:
3310: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
3320: 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20  tem unknown..** 
3330: 31 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73  1:   Operating s
3340: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a  ystem is Win9x..
3350: 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 2:   Operatin
3360: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e  g system is WinN
3370: 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  T..**.** In orde
3380: 72 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  r to facilitate 
3390: 74 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e  testing on a Win
33a0: 4e 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74  NT system, the t
33b0: 65 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63  est fixture.** c
33c0: 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20  an manually set 
33d0: 74 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20  this value to 1 
33e0: 74 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38  to emulate Win98
33f0: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69   behavior..*/.#i
3400: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
3410: 0a 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e  .LONG SQLITE_WIN
3420: 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69  32_VOLATILE sqli
3430: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
3440: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 4c 4f  .#else.static LO
3450: 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  NG SQLITE_WIN32_
3460: 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33  VOLATILE sqlite3
3470: 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65  _os_type = 0;.#e
3480: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59  ndif..#ifndef SY
3490: 53 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20  SCALL.#  define 
34a0: 53 59 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f  SYSCALL sqlite3_
34b0: 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64  syscall_ptr.#end
34c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
34d0: 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61  unction is not a
34e0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
34f0: 6f 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e  ows CE or WinRT.
3500: 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  . */..#if SQLITE
3510: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
3520: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20  ITE_OS_WINRT.#  
3530: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
3540: 41 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20  ApisANSI()      
3550: 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   1.#endif../*.**
3560: 20 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c   Many system cal
3570: 6c 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20  ls are accessed 
3580: 74 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d  through pointer-
3590: 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20  to-functions so 
35a0: 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79  that.** they may
35b0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61   be overridden a
35c0: 74 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63  t runtime to fac
35d0: 69 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e  ilitate fault in
35e0: 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a  jection during.*
35f0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61  * testing and sa
3600: 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66  ndboxing.  The f
3610: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68  ollowing array h
3620: 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61  olds the names a
3630: 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74  nd pointers.** t
3640: 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62  o all overrideab
3650: 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e  le system calls.
3660: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
3670: 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a  t win_syscall {.
3680: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
3690: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
36a0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
36b0: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
36c0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
36d0: 70 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a  ptr pCurrent; /*
36e0: 20 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   Current value o
36f0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
3700: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
3710: 79 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61  yscall_ptr pDefa
3720: 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20  ult; /* Default 
3730: 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63  value */.} aSysc
3740: 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53  all[] = {.#if !S
3750: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3760: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
3770: 52 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  RT.  { "AreFileA
3780: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
3790: 20 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69    (SYSCALL)AreFi
37a0: 6c 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20  leApisANSI,     
37b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
37c0: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
37d0: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
37e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
3810: 6e 64 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70  ndef osAreFileAp
3820: 69 73 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f  isANSI.#define o
3830: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
3840: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
3850: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
3860: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  0].pCurrent).#en
3870: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
3880: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
3890: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
38a0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
38b0: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20  CharLowerW",    
38c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
38d0: 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20  LL)CharLowerW,  
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
38f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72  .#else.  { "Char
3900: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
3910: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3920: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3930: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3940: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
3950: 68 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53  harLowerW ((LPWS
3960: 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53  TR(WINAPI*)(LPWS
3970: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e  TR))aSyscall[1].
3980: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
3990: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
39a0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
39b0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
39c0: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57  .  { "CharUpperW
39d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
39e0: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70  (SYSCALL)CharUpp
39f0: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
3a00: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3a10: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3a30: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3a50: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3a60: 6e 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 20  ne osCharUpperW 
3a70: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
3a80: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
3a90: 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[2].pCurrent).
3aa0: 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c  .  { "CloseHandl
3ab0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
3ac0: 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61  (SYSCALL)CloseHa
3ad0: 6e 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  ndle,           
3ae0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
3af0: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28  osCloseHandle ((
3b00: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
3b10: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  NDLE))aSyscall[3
3b20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3b30: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3b40: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
3b50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41    { "CreateFileA
3b60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3b70: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
3b80: 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20  leA,            
3b90: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3ba0: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
3bb0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3bc0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3be0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3bf0: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20  e osCreateFileA 
3c00: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
3c10: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44  )(LPCSTR,DWORD,D
3c20: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
3c30: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
3c40: 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52  BUTES,DWORD,DWOR
3c50: 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  D,HANDLE))aSysca
3c60: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
3c70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3c80: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3c90: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3ca0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
3cb0: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  ateFileW",      
3cc0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3cd0: 43 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20  CreateFileW,    
3ce0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3cf0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3d00: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3d10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3d40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3d50: 74 65 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45  teFileW ((HANDLE
3d60: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
3d70: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
3d80: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
3d90: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
3da0: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
3db0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  E))aSyscall[5].p
3dc0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21  Current)..#if (!
3dd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3de0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3df0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3e00: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  ) && \.        (
3e10: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3e20: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
3e30: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
3e40: 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74  E>0)).  { "Creat
3e50: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
3e60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
3e70: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
3e80: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
3e90: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
3ea0: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
3eb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3ee0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3ef0: 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48  FileMappingA ((H
3f00: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
3f10: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
3f20: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
3f30: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
3f40: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29  RD,DWORD,LPCSTR)
3f50: 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75  )aSyscall[6].pCu
3f60: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
3f70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
3f80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3f90: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3fa0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3fb0: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
3fc0: 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  (!defined(SQLITE
3fd0: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
3fe0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
3ff0: 5a 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61  ZE>0)).  { "Crea
4000: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
4010: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
4020: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4030: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
4040: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
4050: 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20  leMappingW",    
4060: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4080: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4090: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
40a0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28  eFileMappingW ((
40b0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
40c0: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
40d0: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
40e0: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
40f0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  ORD,DWORD,LPCWST
4100: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  R))aSyscall[7].p
4110: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4120: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4130: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4140: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4150: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
4160: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
4170: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d  (SYSCALL)CreateM
4180: 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20  utexW,          
4190: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
41a0: 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c   "CreateMutexW",
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
41c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
41e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
41f0: 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78  ne osCreateMutex
4200: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
4210: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
4220: 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20  TTRIBUTES,BOOL, 
4230: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54  \.        LPCWST
4240: 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  R))aSyscall[8].p
4250: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4270: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
4280: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
4290: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
42a0: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41  CALL)DeleteFileA
42b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
42c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
42d0: 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  leteFileA",     
42e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
42f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4320: 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42  sDeleteFileA ((B
4330: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4340: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  STR))aSyscall[9]
4350: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4360: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4370: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4380: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
4390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
43a0: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
43b0: 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eW,             
43c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
43d0: 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20  DeleteFileW",   
43e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
43f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4400: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4410: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4420: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28   osDeleteFileW (
4430: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
4440: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
4450: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
4460: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4470: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
4480: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4490: 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65  ", (SYSCALL)File
44a0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
44b0: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
44c0: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c    { "FileTimeToL
44d0: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28  ocalFileTime", (
44e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4510: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
4520: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20  ToLocalFileTime 
4530: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4540: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
4550: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
4560: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
4570: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
4580: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4590: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
45a0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
45b0: 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54    (SYSCALL)FileT
45c0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c  imeToSystemTime,
45d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
45e0: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79   { "FileTimeToSy
45f0: 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53  stemTime",    (S
4600: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4630: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
4640: 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f  oSystemTime ((BO
4650: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
4660: 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20  T FILETIME*, \. 
4670: 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54         LPSYSTEMT
4680: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32  IME))aSyscall[12
4690: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
46a0: 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65   "FlushFileBuffe
46b0: 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  rs",        (SYS
46c0: 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75  CALL)FlushFileBu
46d0: 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20  ffers,        0 
46e0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c  },..#define osFl
46f0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28  ushFileBuffers (
4700: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4710: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4720: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  13].pCurrent)..#
4730: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4740: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4750: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
4760: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
4770: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
4780: 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20  MessageA,       
4790: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
47a0: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
47b0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  A",          (SY
47c0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
47e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
47f0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
4800: 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e  ageA ((DWORD(WIN
4810: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
4820: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
4830: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
4840: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
4850: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
4860: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4870: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4880: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4890: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
48a0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
48b0: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
48c0: 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eW,          0 }
48d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
48e0: 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20  matMessageW",   
48f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4900: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4910: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4920: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4930: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28  FormatMessageW (
4940: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4950: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
4960: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  ORD,DWORD,LPWSTR
4970: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
4980: 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73  D,va_list*))aSys
4990: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
49a0: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
49b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
49c0: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b  D_EXTENSION).  {
49d0: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
49f0: 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79  CALL)FreeLibrary
4a00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4a10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72  },.#else.  { "Fr
4a20: 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  eeLibrary",     
4a30: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a40: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4a50: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4a60: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4a70: 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42  sFreeLibrary ((B
4a80: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  OOL(WINAPI*)(HMO
4a90: 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  DULE))aSyscall[1
4aa0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
4ab0: 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f  { "GetCurrentPro
4ac0: 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59  cessId",     (SY
4ad0: 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74  SCALL)GetCurrent
4ae0: 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30  ProcessId,     0
4af0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
4b00: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
4b10: 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Id ((DWORD(WINAP
4b20: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
4b30: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
4b40: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4b50: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
4b60: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4b70: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
4b80: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
4b90: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
4ba0: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
4bb0: 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eA,       0 },.#
4bc0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
4bd0: 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20  kFreeSpaceA",   
4be0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4c10: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4c20: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28  DiskFreeSpaceA (
4c30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
4c40: 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  PCSTR,LPDWORD,LP
4c50: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
4c60: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
4c70: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
4c80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4c90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
4ca0: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
4cb0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
4cc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4cd0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73  IDE).  { "GetDis
4ce0: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
4cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4d00: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20  DiskFreeSpaceW, 
4d10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4d20: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
4d30: 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20  eSpaceW",       
4d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4d70: 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b  define osGetDisk
4d80: 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f  FreeSpaceW ((BOO
4d90: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  L(WINAPI*)(LPCWS
4da0: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
4db0: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
4dc0: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
4dd0: 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72  Syscall[19].pCur
4de0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4df0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4e00: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
4e10: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4e20: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
4e30: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4e40: 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesA,      0 },.
4e50: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4e60: 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20  leAttributesA", 
4e70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ea0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4eb0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
4ec0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4ed0: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
4ee0: 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[20].pCurrent)
4ef0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4f00: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
4f10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4f20: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
4f30: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4f40: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
4f50: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
4f60: 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esW,      0 },.#
4f70: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
4f80: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
4f90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fb0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4fc0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
4fd0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20  FileAttributesW 
4fe0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4ff0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
5000: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
5010: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5020: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
5030: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
5040: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
5050: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5060: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
5070: 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  W,    0 },.#else
5080: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
5090: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
50a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
50d0: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
50e0: 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28  AttributesExW ((
50f0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
5100: 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58  CWSTR,GET_FILEEX
5110: 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a  _INFO_LEVELS, \.
5120: 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29          LPVOID))
5130: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
5140: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5150: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5160: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
5170: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5180: 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65  CALL)GetFileSize
5190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
51a0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
51b0: 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20  tFileSize",     
51c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
51d0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
51e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
51f0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5200: 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44  sGetFileSize ((D
5210: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
5220: 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53  NDLE,LPDWORD))aS
5230: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
5240: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5250: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
5260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5270: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
5280: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5290: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
52a0: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
52b0: 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20  NameA,        0 
52c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
52d0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c  tFullPathNameA",
52e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
52f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5320: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
5330: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
5340: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
5350: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
5360: 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c   LPSTR*))aSyscal
5370: 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[24].pCurrent).
5380: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5390: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
53a0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
53b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
53c0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
53d0: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
53e0: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
53f0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
5400: 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d  ameW,        0 }
5410: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5420: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20  FullPathNameW", 
5430: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5440: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5450: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5460: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5470: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
5480: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5490: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
54a0: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
54b0: 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63    LPWSTR*))aSysc
54c0: 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74  all[25].pCurrent
54d0: 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45  )..  { "GetLastE
54e0: 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20  rror",          
54f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61    (SYSCALL)GetLa
5500: 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  stError,        
5510: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
5520: 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  e osGetLastError
5530: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5540: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
5550: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
5560: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
5570: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
5580: 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c  TENSION).#if SQL
5590: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
55a0: 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
55b0: 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
55c0: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
55d0: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e  e on Windows CE.
55e0: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
55f0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
5600: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
5610: 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20  rocAddressA,    
5620: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5630: 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57    /* All other W
5640: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
5650: 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41   expect GetProcA
5660: 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65  ddress() to take
5670: 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74  .  ** an ANSI st
5680: 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ring regardless 
5690: 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20  of the _UNICODE 
56a0: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22  setting */.  { "
56b0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
56c0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
56d0: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
56e0: 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  s,          0 },
56f0: 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20  .#endif.#else.  
5700: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
5710: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
5720: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5740: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5750: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64  ine osGetProcAdd
5760: 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28  ressA ((FARPROC(
5770: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
5780: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
5790: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d  TR))aSyscall[27]
57a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
57b0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
57c0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
57d0: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
57e0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
57f0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
5800: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5810: 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22   "GetSystemInfo"
5820: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5830: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5850: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5860: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
5870: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
5880: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
5890: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
58a0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
58b0: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
58c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
58d0: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
58e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
58f0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
5900: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
5910: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
5920: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
5930: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
5940: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5950: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
5960: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
5970: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
5980: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5990: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
59a0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
59b0: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
59c0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
59f0: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
5a00: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
5a10: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
5a20: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
5a30: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
5a40: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
5a50: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5a60: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
5a70: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
5a80: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
5a90: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
5aa0: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
5ab0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5ac0: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
5ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5ae0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5b00: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5b10: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
5b20: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
5b30: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
5b40: 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43  )aSyscall[31].pC
5b50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5b60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5b70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5b80: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5b90: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
5ba0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5bb0: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
5bc0: 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20  athW,           
5bd0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5be0: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
5bf0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5c00: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5c20: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5c30: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  e osGetTempPathW
5c40: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5c50: 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29  )(DWORD,LPWSTR))
5c60: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
5c70: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5c80: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
5c90: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5cb0: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
5cc0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  t,            0 
5cd0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5ce0: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
5cf0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5d00: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5d10: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5d20: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5d30: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28  sGetTickCount ((
5d40: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
5d50: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33  OID))aSyscall[33
5d60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5d70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5d80: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
5d90: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5da0: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
5db0: 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20 20 20  ONEX) && \.     
5dc0: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
5dd0: 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b  GETVERSIONEX.  {
5de0: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
5df0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
5e00: 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45  CALL)GetVersionE
5e10: 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30 20  xA,           0 
5e20: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5e30: 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20  tVersionExA",   
5e40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5e60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5e70: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5e80: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28  sGetVersionExA (
5e90: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5ea0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45  \.        LPOSVE
5eb0: 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73  RSIONINFOA))aSys
5ec0: 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e  call[34].pCurren
5ed0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5ee0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
5ef0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5f00: 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a  _HAS_WIDE) && \.
5f10: 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 64 28          defined(
5f20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
5f30: 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53 51  VERSIONEX) && SQ
5f40: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
5f50: 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74  RSIONEX.  { "Get
5f60: 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20  VersionExW",    
5f70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5f80: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20  GetVersionExW,  
5f90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5fa0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73  lse.  { "GetVers
5fb0: 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20  ionExW",        
5fc0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5ff0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56  ..#define osGetV
6000: 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c  ersionExW ((BOOL
6010: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
6020: 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e       LPOSVERSION
6030: 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b  INFOW))aSyscall[
6040: 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  35].pCurrent).. 
6050: 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20   { "HeapAlloc", 
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6070: 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63  YSCALL)HeapAlloc
6080: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6090: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
60a0: 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f  HeapAlloc ((LPVO
60b0: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
60c0: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
60d0: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
60e0: 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e  call[36].pCurren
60f0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6100: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
6110: 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  apCreate",      
6120: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6130: 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20 20  )HeapCreate,    
6140: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6150: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72  else.  { "HeapCr
6160: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
6170: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
61a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
61b0: 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45  pCreate ((HANDLE
61c0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
61d0: 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20  SIZE_T, \.      
61e0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
61f0: 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[37].pCurrent)
6200: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6210: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
6220: 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20  Destroy",       
6230: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6240: 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20  eapDestroy,     
6250: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6260: 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74  se.  { "HeapDest
6270: 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  roy",           
6280: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
62b0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44  .#define osHeapD
62c0: 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49  estroy ((BOOL(WI
62d0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
62e0: 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72  Syscall[38].pCur
62f0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
6300: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
6310: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6320: 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20 20  eapFree,        
6330: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
6340: 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65  efine osHeapFree
6350: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6360: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
6370: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
6380: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  9].pCurrent)..  
6390: 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c  { "HeapReAlloc",
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
63b0: 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f  SCALL)HeapReAllo
63c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  c,             0
63d0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
63e0: 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56  eapReAlloc ((LPV
63f0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6400: 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44  DLE,DWORD,LPVOID
6410: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6420: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d  _T))aSyscall[40]
6430: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6440: 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20  "HeapSize",     
6450: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6460: 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20  ALL)HeapSize,   
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6480: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6490: 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57  pSize ((SIZE_T(W
64a0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
64b0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
64c0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
64d0: 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[41].pCurrent).
64e0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
64f0: 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56  WINRT.  { "HeapV
6500: 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20  alidate",       
6510: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6520: 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20  apValidate,     
6530: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6540: 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64  e.  { "HeapValid
6550: 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
6560: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6590: 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61  #define osHeapVa
65a0: 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49  lidate ((BOOL(WI
65b0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
65c0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
65d0: 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  PCVOID))aSyscall
65e0: 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [42].pCurrent)..
65f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6600: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
6610: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65  OS_WINRT.  { "He
6620: 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20  apCompact",     
6630: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6640: 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20 20  )HeapCompact,   
6650: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6660: 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43 6f  else.  { "HeapCo
6670: 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20 20  mpact",         
6680: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
66b0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  f..#define osHea
66c0: 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54 28  pCompact ((UINT(
66d0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
66e0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
66f0: 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  43].pCurrent)..#
6700: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
6710: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
6720: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
6730: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
6740: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
6750: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
6760: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6770: 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20  L)LoadLibraryA, 
6780: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6790: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c  #else.  { "LoadL
67a0: 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20  ibraryA",       
67b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
67e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
67f0: 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f  adLibraryA ((HMO
6800: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
6810: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34  CSTR))aSyscall[4
6820: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6830: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6840: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
6850: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
6860: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
6870: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
6880: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
6890: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64  NSION).  { "Load
68a0: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
68b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
68c0: 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20  oadLibraryW,    
68d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
68e0: 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  se.  { "LoadLibr
68f0: 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20  aryW",          
6900: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6930: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c  .#define osLoadL
6940: 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c  ibraryW ((HMODUL
6950: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
6960: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  TR))aSyscall[45]
6970: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6980: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6990: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
69a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
69b0: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72  (SYSCALL)LocalFr
69c0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ee,             
69d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
69e0: 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20   "LocalFree",   
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6a00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6a20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6a30: 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28  ne osLocalFree (
6a40: 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29  (HLOCAL(WINAPI*)
6a50: 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c  (HLOCAL))aSyscal
6a60: 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[46].pCurrent).
6a70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6a80: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
6a90: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
6aa0: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
6ab0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ac0: 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  L)LockFile,     
6ad0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ae0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6af0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6b00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6b30: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6b40: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
6b50: 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c  sLockFile ((BOOL
6b60: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6b70: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
6b80: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  RD, \.        DW
6b90: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  ORD))aSyscall[47
6ba0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
6bb0: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
6bc0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f  OS_WINCE.  { "Lo
6bd0: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6be0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6bf0: 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  )LockFileEx,    
6c00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6c10: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
6c20: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
6c30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c50: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6c60: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
6c70: 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20  kFileEx.#define 
6c80: 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  osLockFileEx ((B
6c90: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6ca0: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6cb0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6cc0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6cd0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 38  PED))aSyscall[48
6ce0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
6cf0: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
6d00: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
6d10: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6d20: 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69  \.        (!defi
6d30: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
6d40: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
6d50: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29  AX_MMAP_SIZE>0))
6d60: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6d70: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6d80: 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77  (SYSCALL)MapView
6d90: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
6da0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6db0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
6dd0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6df0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6e00: 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  ne osMapViewOfFi
6e10: 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  le ((LPVOID(WINA
6e20: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6e30: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
6e40: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6e50: 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43  )aSyscall[49].pC
6e60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75  urrent)..  { "Mu
6e70: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
6e80: 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  r",     (SYSCALL
6e90: 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  )MultiByteToWide
6ea0: 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  Char,     0 },..
6eb0: 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42  #define osMultiB
6ec0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28  yteToWideChar ((
6ed0: 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e  int(WINAPI*)(UIN
6ee0: 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69  T,DWORD,LPCSTR,i
6ef0: 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  nt,LPWSTR, \.   
6f00: 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61       int))aSysca
6f10: 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[50].pCurrent)
6f20: 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66  ..  { "QueryPerf
6f30: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c  ormanceCounter",
6f40: 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50   (SYSCALL)QueryP
6f50: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
6f60: 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65  r, 0 },..#define
6f70: 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61   osQueryPerforma
6f80: 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f  nceCounter ((BOO
6f90: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
6fa0: 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45        LARGE_INTE
6fb0: 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  GER*))aSyscall[5
6fc0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
6fd0: 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20  { "ReadFile",   
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6ff0: 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20  SCALL)ReadFile, 
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7010: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52   },..#define osR
7020: 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  eadFile ((BOOL(W
7030: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
7040: 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  PVOID,DWORD,LPDW
7050: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7060: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7070: 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65  scall[52].pCurre
7080: 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64  nt)..  { "SetEnd
7090: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
70a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
70b0: 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  EndOfFile,      
70c0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
70d0: 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69  ine osSetEndOfFi
70e0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
70f0: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
7100: 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74  all[53].pCurrent
7110: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
7120: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74  S_WINRT.  { "Set
7130: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
7140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7150: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20  SetFilePointer, 
7160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7170: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
7180: 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20  Pointer",       
7190: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
71c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
71d0: 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f  ilePointer ((DWO
71e0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
71f0: 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c  LE,LONG,PLONG, \
7200: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7210: 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75  aSyscall[54].pCu
7220: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7230: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7240: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
7250: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7260: 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20  CALL)Sleep,     
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7280: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c  },.#else.  { "Sl
7290: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
72a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
72b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
72c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
72d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
72e0: 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49  sSleep ((VOID(WI
72f0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53  NAPI*)(DWORD))aS
7300: 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72  yscall[55].pCurr
7310: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65  ent)..  { "Syste
7320: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22  mTimeToFileTime"
7330: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79  ,    (SYSCALL)Sy
7340: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
7350: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  me,    0 },..#de
7360: 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d  fine osSystemTim
7370: 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f  eToFileTime ((BO
7380: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
7390: 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c  T SYSTEMTIME*, \
73a0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
73b0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36  IME))aSyscall[56
73c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
73d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
73e0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
73f0: 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63  WINRT.  { "Unloc
7400: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
7410: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
7420: 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  lockFile,       
7430: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7440: 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  e.  { "UnlockFil
7450: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
7460: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7490: 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b  #ifndef osUnlock
74a0: 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55  File.#define osU
74b0: 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c  nlockFile ((BOOL
74c0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
74d0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
74e0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  RD, \.        DW
74f0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  ORD))aSyscall[57
7500: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
7510: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
7520: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e  OS_WINCE.  { "Un
7530: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
7540: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7550: 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  )UnlockFileEx,  
7560: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7570: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
7580: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
7590: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
75c0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  f..#define osUnl
75d0: 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c  ockFileEx ((BOOL
75e0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
75f0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
7600: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
7610: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
7620: 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e  call[58].pCurren
7630: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7640: 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69  S_WINCE || !defi
7650: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7660: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
7670: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
7680: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
7690: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
76a0: 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77  YSCALL)UnmapView
76b0: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
76c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
76d0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22  UnmapViewOfFile"
76e0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
76f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7700: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7710: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7720: 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
7730: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7740: 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73  *)(LPCVOID))aSys
7750: 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e  call[59].pCurren
7760: 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61  t)..  { "WideCha
7770: 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20  rToMultiByte",  
7780: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65     (SYSCALL)Wide
7790: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c  CharToMultiByte,
77a0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
77b0: 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d  ne osWideCharToM
77c0: 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57  ultiByte ((int(W
77d0: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
77e0: 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c  RD,LPCWSTR,int,L
77f0: 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20  PSTR,int, \.    
7800: 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f      LPCSTR,LPBOO
7810: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e  L))aSyscall[60].
7820: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7830: 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20  WriteFile",     
7840: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7850: 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20  LL)WriteFile,   
7860: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7870: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74  ..#define osWrit
7880: 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eFile ((BOOL(WIN
7890: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43  API*)(HANDLE,LPC
78a0: 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f  VOID,DWORD,LPDWO
78b0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
78c0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
78d0: 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e  call[61].pCurren
78e0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
78f0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
7900: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
7910: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7920: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20  CreateEventExW, 
7930: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7940: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45  lse.  { "CreateE
7950: 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20  ventExW",       
7960: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7990: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
79a0: 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e  teEventExW ((HAN
79b0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  DLE(WINAPI*)(LPS
79c0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
79d0: 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20  ES,LPCWSTR, \.  
79e0: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
79f0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e  D))aSyscall[62].
7a00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7a10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7a20: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7a30: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
7a40: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
7a50: 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20  ingleObject,    
7a60: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7a70: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7a80: 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43  ject",     (SYSC
7a90: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7ab0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7ac0: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
7ad0: 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28  eObject ((DWORD(
7ae0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7af0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
7b00: 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70  ))aSyscall[63].p
7b10: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
7b20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
7b30: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
7b40: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
7b50: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
7b60: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
7b70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7b80: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7b90: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
7ba0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7bc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7bd0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
7be0: 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44  ObjectEx ((DWORD
7bf0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7c00: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7c10: 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c    BOOL))aSyscall
7c20: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
7c30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7c40: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
7c50: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7c60: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
7c70: 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20  ilePointerEx,   
7c80: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7c90: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7ca0: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
7cb0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7ce0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
7cf0: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
7d00: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7d10: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
7d20: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
7d30: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
7d40: 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72  Syscall[65].pCur
7d50: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7d60: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7d70: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
7d80: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
7d90: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49  SYSCALL)GetFileI
7da0: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7db0: 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  leEx, 0 },.#else
7dc0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
7dd0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
7de0: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  Ex", (SYSCALL)0,
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7e10: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
7e20: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7e30: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
7e40: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
7e50: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
7e60: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
7e70: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
7e80: 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75  aSyscall[66].pCu
7e90: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7ea0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 28  TE_OS_WINRT && (
7eb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7ec0: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
7ed0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
7ee0: 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  E>0).  { "MapVie
7ef0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
7f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
7f10: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7f20: 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  p,    0 },.#else
7f30: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
7f40: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
7f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7f80: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
7f90: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28  OfFileFromApp ((
7fa0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
7fb0: 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f  HANDLE,ULONG,ULO
7fc0: 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20  NG64, \.        
7fd0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
7fe0: 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [67].pCurrent)..
7ff0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8000: 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NRT.  { "CreateF
8010: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
8020: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
8030: 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20  teFile2,        
8040: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8050: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
8060: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
8070: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8090: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
80a0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
80b0: 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  le2 ((HANDLE(WIN
80c0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
80d0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
80e0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45   \.        LPCRE
80f0: 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
8100: 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61 53  D_PARAMETERS))aS
8110: 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72  yscall[68].pCurr
8120: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
8130: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
8140: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8150: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
8160: 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  ).  { "LoadPacka
8170: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
8180: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61   (SYSCALL)LoadPa
8190: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20  ckagedLibrary,  
81a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
81b0: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
81c0: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
81d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
81f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8200: 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  ine osLoadPackag
8210: 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44  edLibrary ((HMOD
8220: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
8230: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
8240: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
8250: 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  69].pCurrent)..#
8260: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8270: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
8280: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
8290: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
82a0: 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20  ckCount64,      
82b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
82c0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
82d0: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
82e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8310: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
8320: 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e  unt64 ((ULONGLON
8330: 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  G(WINAPI*)(VOID)
8340: 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43  )aSyscall[70].pC
8350: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8360: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
8370: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
8380: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
8390: 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79  CALL)GetNativeSy
83a0: 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20  stemInfo,     0 
83b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
83c0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
83d0: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
83e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
83f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8400: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8410: 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
8420: 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41  Info ((VOID(WINA
8430: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
8440: 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61  LPSYSTEM_INFO))a
8450: 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72  Syscall[71].pCur
8460: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
8470: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8480: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f  HAS_ANSI).  { "O
8490: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
84a0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
84b0: 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  L)OutputDebugStr
84c0: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
84d0: 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75  #else.  { "Outpu
84e0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
84f0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8520: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75  if..#define osOu
8530: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
8540: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
8550: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
8560: 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[72].pCurrent).
8570: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
8580: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
8590: 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  DE).  { "OutputD
85a0: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
85b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
85c0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20  utDebugStringW, 
85d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
85e0: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
85f0: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
8600: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8630: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
8640: 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49  bugStringW ((VOI
8650: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
8660: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d  TR))aSyscall[73]
8670: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
8680: 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 22  "GetProcessHeap"
8690: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
86a0: 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65  ALL)GetProcessHe
86b0: 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ap,          0 }
86c0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
86d0: 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48 41  ProcessHeap ((HA
86e0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f  NDLE(WINAPI*)(VO
86f0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d  ID))aSyscall[74]
8700: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8710: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8720: 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c  && (!defined(SQL
8730: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
8740: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
8750: 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43 72  _SIZE>0).  { "Cr
8760: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
8770: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
8780: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
8790: 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c  ingFromApp, 0 },
87a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
87b0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
87c0: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
87d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
87e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
87f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
8800: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8810: 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45  FromApp ((HANDLE
8820: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
8830: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
8840: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
8850: 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  S,ULONG,ULONG64,
8860: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
8870: 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[75].pCurrent).
8880: 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e 20  ./*.** NOTE: On 
8890: 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f 72  some sub-platfor
88a0: 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f 63  ms, the Interloc
88b0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
88c0: 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a 2a  ge "function".**
88d0: 20 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c 79         is really
88e0: 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74 68   just a macro th
88f0: 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69 6c  at uses a compil
8900: 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65 2e  er intrinsic (e.
8910: 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20 20  g. x64)..**     
8920: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79 20    So do not try 
8930: 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73 20  to make this is 
8940: 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61 62  into a redefinab
8950: 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  le interface..*/
8960: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e 74  .#if defined(Int
8970: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
8980: 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49 6e  xchange).  { "In
8990: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
89a0: 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43  Exchange", (SYSC
89b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
89c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
89d0: 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c  #define osInterl
89e0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
89f0: 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64  ange Interlocked
8a00: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 0a  CompareExchange.
8a10: 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65 72  #else.  { "Inter
8a20: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8a30: 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c  hange", (SYSCALL
8a40: 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  )InterlockedComp
8a50: 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20 7d  areExchange, 0 }
8a60: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74  ,..#define osInt
8a70: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
8a80: 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57  xchange ((LONG(W
8a90: 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a 20  INAPI*)(LONG \. 
8aa0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
8ab0: 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20 4c  N32_VOLATILE*, L
8ac0: 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63 61  ONG,LONG))aSysca
8ad0: 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[76].pCurrent)
8ae0: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
8af0: 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  ed(InterlockedCo
8b00: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 20 2a  mpareExchange) *
8b10: 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  /..#if !SQLITE_O
8b20: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
8b30: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
8b40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f  QLITE_WIN32_USE_
8b50: 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43 72  UUID.  { "UuidCr
8b60: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
8b70: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 75       (SYSCALL)Uu
8b80: 69 64 43 72 65 61 74 65 2c 20 20 20 20 20 20 20  idCreate,       
8b90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8ba0: 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74 65  .  { "UuidCreate
8bb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
8bc0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8be0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8bf0: 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72 65  define osUuidCre
8c00: 61 74 65 20 28 28 52 50 43 5f 53 54 41 54 55 53  ate ((RPC_STATUS
8c10: 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49  (RPC_ENTRY*)(UUI
8c20: 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 37 5d  D*))aSyscall[77]
8c30: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8c40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
8c50: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
8c60: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
8c70: 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20  IN32_USE_UUID.  
8c80: 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65 71  { "UuidCreateSeq
8c90: 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53  uential",     (S
8ca0: 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74  YSCALL)UuidCreat
8cb0: 65 53 65 71 75 65 6e 74 69 61 6c 2c 20 20 20 30  eSequential,   0
8cc0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
8cd0: 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74  uidCreateSequent
8ce0: 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53 43 41  ial",     (SYSCA
8cf0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8d00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8d10: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8d20: 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75  osUuidCreateSequ
8d30: 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20 20 20  ential \.       
8d40: 20 28 28 52 50 43 5f 53 54 41 54 55 53 28 52 50   ((RPC_STATUS(RP
8d50: 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a 29  C_ENTRY*)(UUID*)
8d60: 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70 43  )aSyscall[78].pC
8d70: 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45  urrent)..}; /* E
8d80: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
8d90: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
8da0: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
8db0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
8dc0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
8dd0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
8de0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
8df0: 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73  ** "win32" VFSes
8e00: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
8e10: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
8e20: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
8e30: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
8e40: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
8e50: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
8e60: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
8e70: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
8e80: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
8e90: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
8ea0: 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d  int winSetSystem
8eb0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
8ec0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
8ed0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
8ee0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
8ef0: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
8f00: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
8f10: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8f20: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
8f30: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
8f40: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
8f50: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
8f60: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
8f70: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
8f80: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
8f90: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
8fa0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
8fb0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
8fc0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
8fd0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
8fe0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
8ff0: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
9000: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
9010: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
9020: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
9030: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
9040: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
9050: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
9060: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
9070: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
9080: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
9090: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
90a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
90b0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
90c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
90d0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
90e0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
90f0: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
9100: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
9110: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
9120: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
9130: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
9140: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
9150: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
9160: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
9170: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
9180: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
9190: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
91a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
91b0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
91c0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
91d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
91e0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
91f0: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
9200: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
9210: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
9220: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
9230: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
9240: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
9250: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
9260: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
9270: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
9280: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
9290: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
92a0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
92b0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
92c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
92d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
92e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
92f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
9300: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
9310: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
9320: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
9330: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
9340: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
9350: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
9360: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
9370: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
9380: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
9390: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
93a0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
93b0: 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79  all_ptr winGetSy
93c0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
93d0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
93e0: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
93f0: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
9400: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
9410: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9420: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
9430: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
9440: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
9450: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
9460: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
9470: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
9480: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
9490: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
94a0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
94b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
94c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
94d0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
94e0: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
94f0: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
9500: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
9510: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
9520: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
9530: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st system call. 
9540: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
9550: 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
9560: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
9570: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
9580: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
9590: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
95a0: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
95b0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69  c const char *wi
95c0: 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28  nNextSystemCall(
95d0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20  sqlite3_vfs *p, 
95e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
95f0: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
9600: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
9610: 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20  METER(p);.  if( 
9620: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72  zName ){.    for
9630: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
9640: 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69  e(aSyscall)-1; i
9650: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9660: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
9670: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
9680: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9690: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b  }.  }.  for(i++;
96a0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
96b0: 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20  scall); i++){.  
96c0: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
96d0: 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20  ].pCurrent!=0 ) 
96e0: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
96f0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  i].zName;.  }.  
9700: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
9710: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
9720: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66  _MALLOC./*.** If
9730: 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20   a Win32 native 
9740: 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f  heap has been co
9750: 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66  nfigured, this f
9760: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74  unction will att
9770: 65 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61  empt to.** compa
9780: 63 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63  ct it.  Upon suc
9790: 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  cess, SQLITE_OK 
97a0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
97b0: 2e 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c  .  Upon failure,
97c0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54   one.** of SQLIT
97d0: 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f  E_NOMEM, SQLITE_
97e0: 45 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45  ERROR, or SQLITE
97f0: 5f 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62  _NOTFOUND will b
9800: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65  e returned.  The
9810: 0a 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20  .** "pnLargest" 
9820: 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e  argument, if non
9830: 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75  -zero, will be u
9840: 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68  sed to return th
9850: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
9860: 20 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74   largest committ
9870: 65 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e  ed free block in
9880: 20 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79   the heap, in by
9890: 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  tes..*/.int sqli
98a0: 74 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63  te3_win32_compac
98b0: 74 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e  t_heap(LPUINT pn
98c0: 4c 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20  Largest){.  int 
98d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
98e0: 20 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20    UINT nLargest 
98f0: 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48  = 0;.  HANDLE hH
9900: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
9910: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
9920: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
9930: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
9940: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
9950: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
9960: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9970: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
9980: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
9990: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
99a0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
99b0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
99c0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
99d0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
99e0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
99f0: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  LL) );.#endif.#i
9a00: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
9a10: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
9a20: 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c  _WINRT.  if( (nL
9a30: 61 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d  argest=osHeapCom
9a40: 70 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49  pact(hHeap, SQLI
9a50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9a60: 41 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AGS))==0 ){.    
9a70: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
9a80: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
9a90: 28 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74  ();.    if( last
9aa0: 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20  Errno==NO_ERROR 
9ab0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9ac0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
9ad0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
9ae0: 61 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70  apCompact (no sp
9af0: 61 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  ace), heap=%p",.
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
9b20: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
9b30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
9b40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
9b50: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
9b60: 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ROR, "failed to 
9b70: 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75  HeapCompact (%lu
9b80: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
9ba0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
9bb0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
9bc0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9bd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
9be0: 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74   }.#else.  sqlit
9bf0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
9c00: 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20  TFOUND, "failed 
9c10: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  to HeapCompact, 
9c20: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
9c30: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
9c40: 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51  Heap);.  rc = SQ
9c50: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23  LITE_NOTFOUND;.#
9c60: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61  endif.  if( pnLa
9c70: 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65  rgest ) *pnLarge
9c80: 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20  st = nLargest;. 
9c90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9ca0: 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20  *.** If a Win32 
9cb0: 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20  native heap has 
9cc0: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
9cd0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
9ce0: 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a  ill attempt to.*
9cf0: 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  * destroy and re
9d00: 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74  create it.  If t
9d10: 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20  he Win32 native 
9d20: 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c  heap is not isol
9d30: 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74  ated and/or.** t
9d40: 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  he sqlite3_memor
9d50: 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f  y_used() functio
9d60: 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72  n does not retur
9d70: 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42  n zero, SQLITE_B
9d80: 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72  USY will.** be r
9d90: 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63  eturned and no c
9da0: 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d  hanges will be m
9db0: 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ade to the Win32
9dc0: 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f   native heap..*/
9dd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
9de0: 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b  32_reset_heap(){
9df0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54  .  int rc;.  MUT
9e00: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
9e10: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
9e20: 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ; ) /* The main 
9e30: 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a  static mutex */.
9e40: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
9e50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
9e60: 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20  em; )    /* The 
9e70: 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75  memsys static mu
9e80: 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  tex */.  MUTEX_L
9e90: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
9ea0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
9eb0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
9ec0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
9ed0: 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43   ).  MUTEX_LOGIC
9ee0: 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33  ( pMem = sqlite3
9ef0: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
9f00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
9f10: 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74  _MEM); ).  sqlit
9f20: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
9f30: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
9f40: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
9f50: 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73  Mem);.  winMemAs
9f60: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69  sertMagic();.  i
9f70: 66 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  f( winMemGetHeap
9f80: 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d  ()!=NULL && winM
9f90: 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20  emGetOwned() && 
9fa0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9fb0: 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sed()==0 ){.    
9fc0: 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69  /*.    ** At thi
9fd0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73  s point, there s
9fe0: 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73  hould be no outs
9ff0: 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61  tanding memory a
a000: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20  llocations on.  
a010: 20 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20    ** the heap.  
a020: 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68  Also, since both
a030: 20 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20   the master and 
a040: 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65  memsys locks are
a050: 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a   currently.    *
a060: 2a 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  * being held by 
a070: 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e  us, no other fun
a080: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d  ction (i.e. from
a090: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29   another thread)
a0a0: 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62   should.    ** b
a0b0: 65 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61  e able to even a
a0c0: 63 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20  ccess the heap. 
a0d0: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74   Attempt to dest
a0e0: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
a0f0: 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c   our.    ** isol
a100: 61 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76  ated Win32 nativ
a110: 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20  e heap now..    
a120: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  */.    assert( w
a130: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
a140: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
a150: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  rt( winMemGetOwn
a160: 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ed() );.    asse
a170: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  rt( sqlite3_memo
a180: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
a190: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
a1a0: 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61  wn(winMemGetData
a1b0: 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65  Ptr());.    asse
a1c0: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  rt( winMemGetHea
a1d0: 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20  p()==NULL );.   
a1e0: 20 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d   assert( !winMem
a1f0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
a200: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a210: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
a220: 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  =0 );.    rc = w
a230: 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d  inMemInit(winMem
a240: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
a250: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
a260: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d  QLITE_OK || winM
a270: 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c  emGetHeap()!=NUL
a280: 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  L );.    assert(
a290: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a2a0: 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  | winMemGetOwned
a2b0: 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  () );.    assert
a2c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a2d0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  || sqlite3_memor
a2e0: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
a2f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20   }else{.    /*. 
a300: 20 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20     ** The Win32 
a310: 6e 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e  native heap cann
a320: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62  ot be modified b
a330: 65 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65  ecause it may be
a340: 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   in use..    */.
a350: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a360: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BUSY;.  }.  sqli
a370: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a380: 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  pMem);.  sqlite3
a390: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
a3a0: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
a3b0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
a3c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
a3d0: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  LOC */../*.** Th
a3e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70  is function outp
a3f0: 75 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65  uts the specifie
a400: 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20  d (ANSI) string 
a410: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62  to the Win32 deb
a420: 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61  ugger.** (if ava
a430: 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69  ilable)..*/..voi
a440: 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  d sqlite3_win32_
a450: 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73  write_debug(cons
a460: 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e  t char *zBuf, in
a470: 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20  t nBuf){.  char 
a480: 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57  zDbgBuf[SQLITE_W
a490: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
a4a0: 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d  E];.  int nMin =
a4b0: 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49   MIN(nBuf, (SQLI
a4c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
a4d0: 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20  _SIZE - 1)); /* 
a4e0: 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  may be negative.
a4f0: 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d   */.  if( nMin<-
a500: 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f  1 ) nMin = -1; /
a510: 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76  * all negative v
a520: 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e  alues become -1.
a530: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d   */.  assert( nM
a540: 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d  in==-1 || nMin==
a550: 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45  0 || nMin<SQLITE
a560: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
a570: 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e  IZE );.#if defin
a580: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
a590: 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20  HAS_ANSI).  if( 
a5a0: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
a5b0: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
a5c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
a5d0: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
a5e0: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
a5f0: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
a600: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
a610: 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b  tringA(zDbgBuf);
a620: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73  .  }else{.    os
a630: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
a640: 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  gA(zBuf);.  }.#e
a650: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
a660: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
a670: 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  E).  memset(zDbg
a680: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
a690: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
a6a0: 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c  E);.  if ( osMul
a6b0: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
a6c0: 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72  (.          osAr
a6d0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
a6e0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
a6f0: 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20  MCP, 0, zBuf,.  
a700: 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c          nMin, (L
a710: 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53  PWSTR)zDbgBuf, S
a720: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a730: 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28  BUF_SIZE/sizeof(
a740: 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20  WCHAR))<=0 ){.  
a750: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
a760: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
a770: 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44  ingW((LPCWSTR)zD
a780: 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20  bgBuf);.#else.  
a790: 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20  if( nMin>0 ){.  
a7a0: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
a7b0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
a7c0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
a7d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67  .    memcpy(zDbg
a7e0: 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29  Buf, zBuf, nMin)
a7f0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
a800: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67  derr, "%s", zDbg
a810: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
a820: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
a830: 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a  r, "%s", zBuf);.
a840: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
a850: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
a860: 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e  g routine suspen
a870: 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ds the current t
a880: 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61  hread for at lea
a890: 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65  st ms.** millise
a8a0: 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20  conds.  This is 
a8b0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68  equivalent to th
a8c0: 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20  e Win32 Sleep() 
a8d0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
a8e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
a8f0: 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20  T.static HANDLE 
a900: 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
a910: 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71  .#endif..void sq
a920: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
a930: 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63  p(DWORD millisec
a940: 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54  onds){.#if SQLIT
a950: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20  E_OS_WINRT.  if 
a960: 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c  ( sleepObj==NULL
a970: 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a   ){.    sleepObj
a980: 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74   = osCreateEvent
a990: 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  ExW(NULL, NULL, 
a9a0: 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e  CREATE_EVENT_MAN
a9b0: 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20  UAL_RESET,.     
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48             SYNCH
a9e0: 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61  RONIZE);.  }.  a
a9f0: 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21  ssert( sleepObj!
aa00: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69  =NULL );.  osWai
aa10: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
aa20: 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c  Ex(sleepObj, mil
aa30: 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45  liseconds, FALSE
aa40: 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65  );.#else.  osSle
aa50: 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  ep(milliseconds)
aa60: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
aa70: 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
aa80: 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21  R_THREADS>0 && !
aa90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
aaa0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
aab0: 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20  NRT && \.       
aac0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
aad0: 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74  FE>0.DWORD sqlit
aae0: 65 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44  e3Win32Wait(HAND
aaf0: 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44  LE hObject){.  D
ab00: 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65  WORD rc;.  while
ab10: 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f  ( (rc = osWaitFo
ab20: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
ab30: 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54  hObject, INFINIT
ab40: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29            TRUE))
ab70: 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45  ==WAIT_IO_COMPLE
ab80: 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72  TION ){}.  retur
ab90: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
aba0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
abb0: 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  e (non-zero) if 
abc0: 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75  we are running u
abd0: 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32  nder WinNT, Win2
abe0: 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20  K, WinXP,.** or 
abf0: 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66  WinCE.  Return f
ac00: 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20  alse (zero) for 
ac10: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72  Win95, Win98, or
ac20: 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65   WinME..**.** He
ac30: 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73  re is an interes
ac40: 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e  ting observation
ac50: 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  :  Win95, Win98,
ac60: 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a   and WinME lack.
ac70: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
ac80: 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65  x() API.  But we
ac90: 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69   can still stati
aca0: 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e  cally link again
acb0: 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61  st that.** API a
acc0: 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e  s long as we don
acd0: 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20  't call it when 
ace0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
acf0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
ad00: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
ad10: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
ad20: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
ad30: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
ad40: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
ad50: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
ad60: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
ad70: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
ad80: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
ad90: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
ada0: 2e 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ..*/..#if !defin
adb0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
adc0: 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 7c 7c  GETVERSIONEX) ||
add0: 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47   !SQLITE_WIN32_G
ade0: 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65  ETVERSIONEX.# de
adf0: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
ae00: 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  1).#elif SQLITE_
ae10: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
ae20: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21  TE_OS_WINRT || !
ae30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
ae40: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23  IN32_HAS_ANSI).#
ae50: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
ae60: 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66    (1).#elif !def
ae70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
ae80: 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65  2_HAS_WIDE).# de
ae90: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
aea0: 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  0).#else.# defin
aeb0: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71  e osIsNT()  ((sq
aec0: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32  lite3_os_type==2
aed0: 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e  ) || sqlite3_win
aee0: 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64  32_is_nt()).#end
aef0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
af00: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
af10: 65 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e  es if the machin
af20: 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76  e is running a v
af30: 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77  ersion of Window
af40: 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68  s.** based on th
af50: 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a  e NT kernel..*/.
af60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  int sqlite3_win3
af70: 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23  2_is_nt(void){.#
af80: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
af90: 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  RT.  /*.  ** NOT
afa0: 45 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62  E: The WinRT sub
afb0: 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77  -platform is alw
afc0: 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62  ays assumed to b
afd0: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  e based on the N
afe0: 54 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72  T.  **       ker
aff0: 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  nel..  */.  retu
b000: 72 6e 20 31 3b 0a 23 65 6c 69 66 20 64 65 66 69  rn 1;.#elif defi
b010: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b020: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20 26  _GETVERSIONEX) &
b030: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
b040: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 69 66  ETVERSIONEX.  if
b050: 28 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  ( osInterlockedC
b060: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
b070: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
b080: 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66   0, 0)==0 ){.#if
b090: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b0a0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
b0b0: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
b0c0: 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49  OA sInfo;.    sI
b0d0: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
b0e0: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
b0f0: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47  (sInfo);.    osG
b100: 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49  etVersionExA(&sI
b110: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65  nfo);.    osInte
b120: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b130: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b140: 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20  os_type,.       
b150: 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f   (sInfo.dwPlatfo
b160: 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54  rmId == VER_PLAT
b170: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f  FORM_WIN32_NT) ?
b180: 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69   2 : 1, 0);.#eli
b190: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
b1a0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
b1b0: 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e  .    OSVERSIONIN
b1c0: 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73  FOW sInfo;.    s
b1d0: 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e  Info.dwOSVersion
b1e0: 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f  InfoSize = sizeo
b1f0: 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73  f(sInfo);.    os
b200: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73  GetVersionExW(&s
b210: 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74  Info);.    osInt
b220: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
b230: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
b240: 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20  _os_type,.      
b250: 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66    (sInfo.dwPlatf
b260: 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41  ormId == VER_PLA
b270: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20  TFORM_WIN32_NT) 
b280: 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e  ? 2 : 1, 0);.#en
b290: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
b2a0: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
b2b0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
b2c0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
b2d0: 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20  2, 2)==2;.#elif 
b2e0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 72 65  SQLITE_TEST.  re
b2f0: 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b  turn osInterlock
b300: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
b310: 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  e(&sqlite3_os_ty
b320: 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65  pe, 2, 2)==2;.#e
b330: 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  lse.  /*.  ** NO
b340: 54 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74  TE: All sub-plat
b350: 66 6f 72 6d 73 20 77 68 65 72 65 20 74 68 65 20  forms where the 
b360: 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d  GetVersionEx[AW]
b370: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20   functions are. 
b380: 20 2a 2a 20 20 20 20 20 20 20 64 65 70 72 65 63   **       deprec
b390: 61 74 65 64 20 61 72 65 20 61 6c 77 61 79 73 20  ated are always 
b3a0: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61  assumed to be ba
b3b0: 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65  sed on the NT ke
b3c0: 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  rnel..  */.  ret
b3d0: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
b3e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
b3f0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a  IN32_MALLOC./*.*
b400: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
b410: 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  s of memory..*/.
b420: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
b430: 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42  MemMalloc(int nB
b440: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
b450: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
b460: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
b470: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
b480: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
b490: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
b4a0: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
b4b0: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
b4c0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b4d0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
b4e0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
b4f0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b500: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
b510: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
b520: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
b530: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
b540: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
b550: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
b560: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
b570: 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c  ;.  p = osHeapAl
b580: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
b590: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b5a0: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
b5b0: 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  es);.  if( !p ){
b5c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
b5d0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
b5e0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c  failed to HeapAl
b5f0: 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 6c  loc %u bytes (%l
b600: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42                nB
b620: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
b630: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
b640: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
b650: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
b660: 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  Free memory..*/.
b670: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
b680: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
b690: 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ior){.  HANDLE h
b6a0: 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  Heap;..  winMemA
b6b0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
b6c0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
b6d0: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
b6e0: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
b6f0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
b700: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
b710: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
b720: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
b730: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b740: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
b750: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
b760: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
b770: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
b780: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
b790: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
b7a0: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
b7b0: 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73   return; /* Pass
b7c0: 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70  ing NULL to Heap
b7d0: 46 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Free is undefine
b7e0: 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48  d. */.  if( !osH
b7f0: 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53  eapFree(hHeap, S
b800: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b810: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
b820: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b830: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
b840: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
b850: 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Free block %p (%
b860: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b880: 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74  Prior, osGetLast
b890: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
b8a0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  hHeap);.  }.}../
b8b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
b8c0: 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74  size of an exist
b8d0: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
b8e0: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
b8f0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
b900: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
b910: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  , int nBytes){. 
b920: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
b930: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
b940: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
b950: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
b960: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
b970: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
b980: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
b990: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
b9a0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
b9b0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
b9c0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
b9d0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
b9e0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
b9f0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
ba00: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
ba10: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
ba20: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
ba30: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e  ndif.  assert( n
ba40: 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66  Bytes>=0 );.  if
ba50: 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  ( !pPrior ){.   
ba60: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
ba70: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
ba80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ba90: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
baa0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
bab0: 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63   = osHeapReAlloc
bac0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
bad0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bae0: 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54   pPrior, (SIZE_T
baf0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20  )nBytes);.  }.  
bb00: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
bb10: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
bb20: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
bb30: 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28  to %s %u bytes (
bb40: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65  pPrior ? "HeapRe
bb70: 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c  Alloc" : "HeapAl
bb80: 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73  loc", nBytes, os
bb90: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
bbc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
bbd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
bbe0: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75  he size of an ou
bbf0: 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61  tstanding alloca
bc00: 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a  tion, in bytes..
bc10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
bc20: 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70  nMemSize(void *p
bc30: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
bc40: 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a  p;.  SIZE_T n;..
bc50: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bc60: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bc70: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bc80: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bc90: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
bca0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bcb0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bcc0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bcd0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bce0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bcf0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
bd00: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
bd10: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
bd20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bd30: 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23 65  _FLAGS, p) );.#e
bd40: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20  ndif.  if( !p ) 
bd50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20  return 0;.  n = 
bd60: 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70  osHeapSize(hHeap
bd70: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
bd80: 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20  EAP_FLAGS, p);. 
bd90: 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29   if( n==(SIZE_T)
bda0: 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  -1 ){.    sqlite
bdb0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
bdc0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
bdd0: 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70  eapSize block %p
bde0: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
bdf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be00: 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72    p, osGetLastEr
be10: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
be20: 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  eap);.    return
be30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
be40: 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   (int)n;.}../*.*
be50: 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71  * Round up a req
be60: 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65  uest size to the
be70: 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f   next valid allo
be80: 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  cation size..*/.
be90: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
bea0: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b  mRoundup(int n){
beb0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
bec0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
bed0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
bee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
bef0: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
bf00: 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d  pData){.  winMem
bf10: 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74  Data *pWinMemDat
bf20: 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20  a = (winMemData 
bf30: 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69  *)pAppData;..  i
bf40: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20  f( !pWinMemData 
bf50: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
bf60: 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28  ERROR;.  assert(
bf70: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
bf80: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
bf90: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
bfa0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
bfb0: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
bfc0: 49 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c  IC2 );..#if !SQL
bfd0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
bfe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
bff0: 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21  P_CREATE.  if( !
c000: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c010: 61 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  ap ){.    DWORD 
c020: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20  dwInitialSize = 
c030: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c040: 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20  P_INIT_SIZE;.   
c050: 20 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d   DWORD dwMaximum
c060: 53 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73 71  Size = (DWORD)sq
c070: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
c080: 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66 28  g.nHeap;.    if(
c090: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d   dwMaximumSize==
c0a0: 30 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61 78  0 ){.      dwMax
c0b0: 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54  imumSize = SQLIT
c0c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
c0d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65  _SIZE;.    }else
c0e0: 20 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53 69   if( dwInitialSi
c0f0: 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  ze>dwMaximumSize
c100: 20 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69 74   ){.      dwInit
c110: 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78 69  ialSize = dwMaxi
c120: 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  mumSize;.    }. 
c130: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
c140: 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72  hHeap = osHeapCr
c150: 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33  eate(SQLITE_WIN3
c160: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20  2_HEAP_FLAGS,.  
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a      dwInitialSiz
c1a0: 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  e, dwMaximumSize
c1b0: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e  );.    if( !pWin
c1c0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
c1d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
c1e0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
c1f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69  ,.          "fai
c200: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74  led to HeapCreat
c210: 65 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25  e (%lu), flags=%
c220: 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c  u, initSize=%lu,
c230: 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20   maxSize=%lu",. 
c240: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
c250: 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54  stError(), SQLIT
c260: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c270: 47 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  GS, dwInitialSiz
c280: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77 4d  e,.          dwM
c290: 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20  aximumSize);.   
c2a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c2b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
c2c0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
c2d0: 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  Owned = TRUE;.  
c2e0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
c2f0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b  mData->bOwned );
c300: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69  .  }.#else.  pWi
c310: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
c320: 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65  = osGetProcessHe
c330: 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69  ap();.  if( !pWi
c340: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
c350: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c360: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c370: 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64  .        "failed
c380: 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65   to GetProcessHe
c390: 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74  ap (%lu)", osGet
c3a0: 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20  LastError());.  
c3b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c3c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69  NOMEM;.  }.  pWi
c3d0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
c3e0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65   = FALSE;.  asse
c3f0: 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  rt( !pWinMemData
c400: 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64  ->bOwned );.#end
c410: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  if.  assert( pWi
c420: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
c430: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
c440: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c450: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
c460: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
c470: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
c480: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
c490: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
c4a0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
c4b0: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
c4c0: 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  te(pWinMemData->
c4d0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c4e0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c4f0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
c500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69  OK;.}../*.** Dei
c520: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
c530: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
c540: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74   void winMemShut
c550: 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44  down(void *pAppD
c560: 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61  ata){.  winMemDa
c570: 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20  ta *pWinMemData 
c580: 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29  = (winMemData *)
c590: 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28  pAppData;..  if(
c5a0: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20   !pWinMemData ) 
c5b0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
c5c0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
c5d0: 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic1==WINMEM_MA
c5e0: 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74  GIC1 );.  assert
c5f0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
c600: 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic2==WINMEM_MA
c610: 47 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70  GIC2 );..  if( p
c620: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c630: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
c640: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
c650: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
c660: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
c670: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
c680: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
c690: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
c6a0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61  _VALIDATE).    a
c6b0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
c6c0: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
c6d0: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
c6e0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c6f0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
c700: 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d  if.    if( pWinM
c710: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
c720: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48  {.      if( !osH
c730: 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d  eapDestroy(pWinM
c740: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29  emData->hHeap) )
c750: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c760: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c770: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
c780: 65 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29  eapDestroy (%lu)
c790: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
c7c0: 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d  , (void*)pWinMem
c7d0: 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20  Data->hHeap);.  
c7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e      }.      pWin
c7f0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c800: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
c810: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
c820: 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hHeap = NULL;.  
c830: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c  }.}../*.** Popul
c840: 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  ate the low-leve
c850: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
c860: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ion function poi
c870: 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69  nters in.** sqli
c880: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
c890: 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20  m with pointers 
c8a0: 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20  to the routines 
c8b0: 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68  in this file. Th
c8c0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73  e.** arguments s
c8d0: 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b  pecify the block
c8e0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61   of memory to ma
c8f0: 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nage..**.** This
c900: 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
c910: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
c920: 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64  e3_config(), and
c930: 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73   therefore.** is
c940: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
c950: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28   be threadsafe (
c960: 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63  it is not)..*/.c
c970: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d  onst sqlite3_mem
c980: 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65  _methods *sqlite
c990: 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69  3MemGetWin32(voi
c9a0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  d){.  static con
c9b0: 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  st sqlite3_mem_m
c9c0: 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74  ethods winMemMet
c9d0: 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e  hods = {.    win
c9e0: 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  MemMalloc,.    w
c9f0: 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77  inMemFree,.    w
ca00: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20  inMemRealloc,.  
ca10: 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20    winMemSize,.  
ca20: 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c    winMemRoundup,
ca30: 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c  .    winMemInit,
ca40: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
ca50: 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65  own,.    &win_me
ca60: 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65  m_data.  };.  re
ca70: 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68  turn &winMemMeth
ca80: 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c  ods;.}..void sql
ca90: 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c  ite3MemSetDefaul
caa0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  t(void){.  sqlit
cab0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
cac0: 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20  _CONFIG_MALLOC, 
cad0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
cae0: 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  32());.}.#endif 
caf0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
cb00: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
cb10: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
cb20: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
cb30: 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54  soft Unicode (UT
cb40: 46 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70  F-16?)..**.** Sp
cb50: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
cb60: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
cb70: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
cb80: 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74   malloc..*/.stat
cb90: 69 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66  ic LPWSTR winUtf
cba0: 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  8ToUnicode(const
cbb0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
cbc0: 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a  ){.  int nChar;.
cbd0: 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69    LPWSTR zWideFi
cbe0: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72  lename;..  nChar
cbf0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
cc00: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
cc10: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
cc20: 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  -1, NULL, 0);.  
cc30: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
cc40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
cc50: 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  }.  zWideFilenam
cc60: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
cc70: 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a  cZero( nChar*siz
cc80: 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d  eof(zWideFilenam
cc90: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
cca0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  WideFilename==0 
ccb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ccc0: 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f  .  }.  nChar = o
ccd0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
cce0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
ccf0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
cd00: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20  zWideFilename,. 
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
cd30: 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
cd40: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
cd50: 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46  ite3_free(zWideF
cd60: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57  ilename);.    zW
cd70: 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ideFilename = 0;
cd80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
cd90: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ideFilename;.}..
cda0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
cdb0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
cdc0: 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
cdd0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
cde0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a  urned string is.
cdf0: 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
ce00: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
ce10: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
ce20: 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55  r *winUnicodeToU
ce30: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
ce40: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
ce50: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
ce60: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  *zFilename;..  n
ce70: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
ce80: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
ce90: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
cea0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
ceb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
cec0: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
ced0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cee0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
cef0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
cf00: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
cf10: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
cf20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cf30: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
cf40: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
cf50: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
cf60: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
cf70: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65  zFilename, nByte
cf80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e    0, 0);.  if( n
cfb0: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
cfc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
cfd0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
cfe0: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
cff0: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d000: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
d010: 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74  nvert an ANSI st
d020: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
d030: 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64  t Unicode, based
d040: 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
d050: 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74  nt codepage sett
d060: 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70  ings for file ap
d070: 69 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  is..**.** Space 
d080: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
d090: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d0a0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
d0b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a  sqlite3_malloc..
d0c0: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
d0d0: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
d0e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
d0f0: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
d100: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
d110: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20  zMbcsFilename;. 
d120: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
d130: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
d140: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
d150: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
d160: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
d170: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
d180: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
d190: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  , -1, NULL,.    
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73              0)*s
d1c0: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
d1d0: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
d1e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d1f0: 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  }.  zMbcsFilenam
d200: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
d210: 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
d220: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
d230: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
d240: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
d250: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d260: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
d270: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
d280: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
d290: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
d2a0: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
d2e0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
d2f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
d300: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
d310: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
d320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
d330: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
d340: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
d350: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
d360: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
d370: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
d380: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
d390: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
d3a0: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
d3b0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d3c0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d3d0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
d3e0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
d3f0: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
d400: 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54  har *winUnicodeT
d410: 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57  oMbcs(LPCWSTR zW
d420: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
d430: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
d440: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
d450: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
d460: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
d470: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
d480: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
d490: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
d4a0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
d4b0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
d4c0: 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  ame, -1, 0, 0, 0
d4d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
d4e0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65  e == 0 ){.    re
d4f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
d500: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
d510: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
d520: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  te );.  if( zFil
d530: 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ename==0 ){.    
d540: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d550: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
d560: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f  arToMultiByte(co
d570: 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65  depage, 0, zWide
d580: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46  Filename, -1, zF
d590: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20           nByte, 
d5c0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79  0, 0);.  if( nBy
d5d0: 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73  te == 0 ){.    s
d5e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
d5f0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c  ename);.    zFil
d600: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  ename = 0;.  }. 
d610: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
d620: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
d630: 65 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68  ert multibyte ch
d640: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
d650: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
d660: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72  to hold the.** r
d670: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d680: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
d690: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d6a0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
d6b0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
d6c0: 5f 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72  _utf8(const char
d6d0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
d6e0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55  char *zFilenameU
d6f0: 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  tf8;.  LPWSTR zT
d700: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
d710: 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  ide = winMbcsToU
d720: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
d730: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
d740: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
d750: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
d760: 65 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e 55  enameUtf8 = winU
d770: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d  nicodeToUtf8(zTm
d780: 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65  pWide);.  sqlite
d790: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
d7a0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  ;.  return zFile
d7b0: 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a  nameUtf8;.}../*.
d7c0: 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38  ** Convert UTF-8
d7d0: 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68   to multibyte ch
d7e0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20  aracter string. 
d7f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d800: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
d810: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
d820: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
d830: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
d840: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
d850: 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e  utf8_to_mbcs(con
d860: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
d870: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
d880: 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50  lenameMbcs;.  LP
d890: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
d8a0: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
d8b0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
d8c0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
d8d0: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
d8e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d8f0: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  .  zFilenameMbcs
d900: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d   = winUnicodeToM
d910: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
d920: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
d930: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
d940: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
d950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
d960: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
d970: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
d980: 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
d990: 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64   directory based
d9a0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69   on.** the provi
d9b0: 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ded arguments.  
d9c0: 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e  The type argumen
d9d0: 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f  t must be 1 in o
d9e0: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a  rder to set the.
d9f0: 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  ** data director
da00: 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20  y or 2 in order 
da10: 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f  to set the tempo
da20: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
da30: 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61   The zValue.** a
da40: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
da50: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
da60: 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68  tory to use.  Th
da70: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  e return value w
da80: 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45  ill be.** SQLITE
da90: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
daa0: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
dab0: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
dac0: 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65  ctory(DWORD type
dad0: 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65  , LPCWSTR zValue
dae0: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69  ){.  char **ppDi
daf0: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66  rectory = 0;.#if
db00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
db10: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20  _AUTOINIT.  int 
db20: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
db30: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
db40: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
db50: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79  .#endif.  if( ty
db60: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
db70: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
db80: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
db90: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
dba0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
dbb0: 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  y;.  }else if( t
dbc0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
dbd0: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
dbe0: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
dbf0: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
dc00: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
dc10: 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ry;.  }.  assert
dc20: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
dc30: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
dc40: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
dc50: 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20  ORY_TYPE.       
dc60: 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49     || type==SQLI
dc70: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
dc80: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29  RECTORY_TYPE.  )
dc90: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  ;.  assert( !ppD
dca0: 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69  irectory || sqli
dcb0: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
dcc0: 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c  pe(*ppDirectory,
dcd0: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
dce0: 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74  ;.  if( ppDirect
dcf0: 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ory ){.    char 
dd00: 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b  *zValueUtf8 = 0;
dd10: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
dd20: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
dd30: 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38        zValueUtf8
dd40: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
dd50: 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20  tf8(zValue);.   
dd60: 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74     if ( zValueUt
dd70: 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f8==0 ){.       
dd80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
dd90: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
dda0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ddb0: 66 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72  free(*ppDirector
ddc0: 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63  y);.    *ppDirec
ddd0: 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66  tory = zValueUtf
dde0: 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  8;.    return SQ
ddf0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
de00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
de10: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OR;.}../*.** The
de20: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
de30: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
de40: 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  Msg.** is zero i
de50: 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
de60: 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
de70: 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
de80: 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
de90: 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
dea0: 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
deb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
dec0: 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
ded0: 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e  g(DWORD lastErrn
dee0: 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  o, int nBuf, cha
def0: 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46  r *zBuf){.  /* F
df00: 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74  ormatMessage ret
df10: 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72  urns 0 on failur
df20: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74  e.  Otherwise it
df30: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68  .  ** returns th
df40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41  e number of TCHA
df50: 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  Rs written to th
df60: 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75  e output.  ** bu
df70: 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20  ffer, excluding 
df80: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20  the terminating 
df90: 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a  null char..  */.
dfa0: 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20    DWORD dwLen = 
dfb0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  0;.  char *zOut 
dfc0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73  = 0;..  if( osIs
dfd0: 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
dfe0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
dff0: 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b  WCHAR zTempWide[
e000: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
e010: 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d  _ERRMSG_CHARS+1]
e020: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
e030: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
e040: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
e050: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
e080: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
e090: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0b0: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
e0e0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e120: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
e150: 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f  IN32_MAX_ERRMSG_
e160: 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20  CHARS,.         
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20      0);.#else.  
e190: 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69    LPWSTR zTempWi
e1a0: 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  de = NULL;.    d
e1b0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
e1c0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
e1d0: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
e1e0: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  BUFFER |.       
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
e210: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
e220: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
e230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e240: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
e250: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
e280: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
e2a0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20         (LPWSTR) 
e2f0: 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20  &zTempWide,.    
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e           0);.#en
e340: 64 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65  dif.    if( dwLe
e350: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
e360: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
e370: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
e380: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
e390: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
e3a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
e3b0: 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69     zOut = winUni
e3c0: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
e3d0: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Wide);.      sql
e3e0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
e3f0: 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49  loc();.#if !SQLI
e400: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
e410: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
e420: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
e430: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
e440: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
e450: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
e460: 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pWide);.#endif. 
e470: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
e480: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
e490: 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
e4a0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20    char *zTemp = 
e4b0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
e4c0: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
e4d0: 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eA(FORMAT_MESSAG
e4e0: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
e4f0: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
e520: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
e550: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
e560: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
e5b0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
e5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5d0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
e5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5f0: 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70    (LPSTR) &zTemp
e600: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e620: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e640: 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  );.    if( dwLen
e650: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
e660: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
e670: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
e680: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
e690: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
e6a0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e6b0: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
e6c0: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
e6d0: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
e6e0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
e6f0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
e700: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
e710: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
e720: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
e730: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
e740: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
e750: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
e760: 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20  ndif.  if( 0 == 
e770: 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  dwLen ){.    sql
e780: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
e790: 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72  uf, zBuf, "OsErr
e7a0: 6f 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c  or 0x%lx (%lu)",
e7b0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74   lastErrno, last
e7c0: 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  Errno);.  }else{
e7d0: 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d  .    /* copy a m
e7e0: 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63  aximum of nBuf c
e7f0: 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62  hars to output b
e800: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  uffer */.    sql
e810: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
e820: 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  uf, zBuf, "%s", 
e830: 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72  zOut);.    /* fr
e840: 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66  ee the UTF8 buff
e850: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
e860: 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
e870: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
e880: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
e890: 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67  unction - winLog
e8a0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20  ErrorAtLine() - 
e8b0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
e8c0: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
e8d0: 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72  o.** winLogError
e8e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
e8f0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
e900: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
e910: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
e920: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
e930: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
e940: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
e950: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
e960: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
e970: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   of.** error cod
e980: 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  e and, if possib
e990: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
e9a0: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
e9b0: 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74  t from.** Format
e9c0: 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  Message..**.** T
e9d0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
e9e0: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
e9f0: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
ea00: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
ea10: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
ea20: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
ea30: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
ea40: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
ea50: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a  ITE_CANTOPEN)..*
ea60: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
ea70: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
ea80: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
ea90: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
eaa0: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
eab0: 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f  led and the asso
eac0: 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74  ciated file-syst
ead0: 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e  em path, if any.
eae0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c  .*/.#define winL
eaf0: 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29  ogError(a,b,c,d)
eb00: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74     winLogErrorAt
eb10: 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c  Line(a,b,c,d,__L
eb20: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
eb30: 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  t winLogErrorAtL
eb40: 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f  ine(.  int errco
eb50: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
eb60: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65         /* SQLite
eb70: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
eb80: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
eb90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
eba0: 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65   /* Win32 last e
ebb0: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
ebc0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20  char *zFunc,    
ebd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
ebe0: 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e  e of OS function
ebf0: 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a   that failed */.
ec00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
ec10: 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
ec20: 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61    /* File path a
ec30: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
ec40: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  rror */.  int iL
ec50: 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ine             
ec60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
ec70: 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  rce line number 
ec80: 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75  where error occu
ec90: 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  rred */.){.  cha
eca0: 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20  r zMsg[500];    
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ecc0: 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65  Human readable e
ecd0: 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69  rror text */.  i
ece0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ed00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ed10: 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30  /..  zMsg[0] = 0
ed20: 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72  ;.  winGetLastEr
ed30: 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f  rorMsg(lastErrno
ed40: 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20  , sizeof(zMsg), 
ed50: 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28  zMsg);.  assert(
ed60: 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45   errcode!=SQLITE
ed70: 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61  _OK );.  if( zPa
ed80: 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20  th==0 ) zPath = 
ed90: 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a  "";.  for(i=0; z
eda0: 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69  Msg[i] && zMsg[i
edb0: 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b  ]!='\r' && zMsg[
edc0: 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d  i]!='\n'; i++){}
edd0: 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a  .  zMsg[i] = 0;.
ede0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72    sqlite3_log(er
edf0: 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73  rcode,.      "os
ee00: 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29  _win.c:%d: (%lu)
ee10: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
ee20: 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74       iLine, last
ee30: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
ee40: 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a  ath, zMsg.  );..
ee50: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
ee60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ;.}../*.** The n
ee70: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
ee80: 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29  hat a ReadFile()
ee90: 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61  , WriteFile(), a
eea0: 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a  nd DeleteFile().
eeb0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  ** will be retri
eec0: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c  ed following a l
eed0: 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70  ocking error - p
eee0: 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62  robably caused b
eef0: 79 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73  y.** antivirus s
ef00: 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74  oftware.  Also t
ef10: 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79  he initial delay
ef20: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
ef30: 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20  t retry..** The 
ef40: 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20  delay increases 
ef50: 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61  linearly with ea
ef60: 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66  ch retry..*/.#if
ef70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
ef80: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20  2_IOERR_RETRY.# 
ef90: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
efa0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20  N32_IOERR_RETRY 
efb0: 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  10.#endif.#ifnde
efc0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
efd0: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
efe0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
eff0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
f000: 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64  RY_DELAY 25.#end
f010: 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  if.static int wi
f020: 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51  nIoerrRetry = SQ
f030: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
f040: 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69  _RETRY;.static i
f050: 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79  nt winIoerrRetry
f060: 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57  Delay = SQLITE_W
f070: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
f080: 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54  _DELAY;../*.** T
f090: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
f0a0: 65 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20  etry1" macro is 
f0b0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
f0c0: 65 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61  e if a particula
f0d0: 72 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  r I/O.** error c
f0e0: 6f 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61  ode obtained via
f0f0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
f100: 69 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62  is eligible to b
f110: 65 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a  e retried.  It.*
f120: 2a 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68  * must accept th
f130: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f  e error code DWO
f140: 52 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61  RD as its only a
f150: 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75  rgument and shou
f160: 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  ld return.** non
f170: 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72  -zero if the err
f180: 6f 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73  or code is trans
f190: 69 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61  ient in nature a
f1a0: 6e 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  nd the operation
f1b0: 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20  .** responsible 
f1c0: 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74  for generating t
f1d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f  he original erro
f1e0: 72 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20  r might succeed 
f1f0: 75 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65  upon being.** re
f200: 74 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75  tried.  The argu
f210: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63  ment to this mac
f220: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76  ro should be a v
f230: 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  ariable..**.** A
f240: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d  dditionally, a m
f250: 61 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49  acro named "winI
f260: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d  oerrCanRetry2" m
f270: 61 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20  ay be defined.  
f280: 49 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69  If it.** is defi
f290: 6e 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ned, it will be 
f2a0: 63 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77  consulted only w
f2b0: 68 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77  hen the macro "w
f2c0: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f2d0: 22 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72  ".** returns zer
f2e0: 6f 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72  o.  The "winIoer
f2f0: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72  rCanRetry2" macr
f300: 6f 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  o is completely 
f310: 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20  optional and.** 
f320: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69  may be used to i
f330: 6e 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61  nclude additiona
f340: 6c 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e  l error codes in
f350: 20 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68   the set that sh
f360: 6f 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69  ould.** result i
f370: 6e 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f  n the failing I/
f380: 4f 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e  O operation bein
f390: 67 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65  g retried by the
f3a0: 20 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20   caller.  If.** 
f3b0: 64 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69  defined, the "wi
f3c0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22  nIoerrCanRetry2"
f3d0: 20 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69   macro must exhi
f3e0: 62 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d  bit external sem
f3f0: 61 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69  antics.** identi
f400: 63 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20  cal to those of 
f410: 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  the "winIoerrCan
f420: 52 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a  Retry1" macro..*
f430: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77  /.#if !defined(w
f440: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f450: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65  ).#define winIoe
f460: 72 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28  rrCanRetry1(a) (
f470: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45  ((a)==ERROR_ACCE
f480: 53 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20  SS_DENIED)      
f490: 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20    || \.         
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52       ((a)==ERROR
f4c0: 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49  _SHARING_VIOLATI
f4d0: 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20  ON)    || \.    
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
f500: 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41  ERROR_LOCK_VIOLA
f510: 54 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c  TION)       || \
f520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f540: 28 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e  (a)==ERROR_DEV_N
f550: 4f 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20  OT_EXIST)       
f560: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
f590: 4e 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29  NETNAME_DELETED)
f5a0: 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f5d0: 52 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54  RROR_SEM_TIMEOUT
f5e0: 29 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  )          || \.
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f610: 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52  a)==ERROR_NETWOR
f620: 4b 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a  K_UNREACHABLE)).
f630: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
f640: 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72   a ReadFile() or
f650: 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72   WriteFile() err
f660: 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b  or occurs, invok
f670: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
f680: 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73  * to see if it s
f690: 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64  hould be retried
f6a0: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74  .  Return TRUE t
f6b0: 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e  o retry.  Return
f6c0: 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76   FALSE.** to giv
f6d0: 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72  e up with an err
f6e0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
f6f0: 74 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  t winRetryIoerr(
f700: 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57  int *pnRetry, DW
f710: 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20  ORD *pError){.  
f720: 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c  DWORD e = osGetL
f730: 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66  astError();.  if
f740: 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49  ( *pnRetry>=winI
f750: 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20  oerrRetry ){.   
f760: 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20   if( pError ){. 
f770: 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65       *pError = e
f780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
f790: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
f7a0: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
f7b0: 31 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  1(e) ){.    sqli
f7c0: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
f7d0: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
f7e0: 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29  ay*(1+*pnRetry))
f7f0: 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79  ;.    ++*pnRetry
f800: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
f810: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
f820: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
f830: 32 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69  2).  else if( wi
f840: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28  nIoerrCanRetry2(
f850: 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  e) ){.    sqlite
f860: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69  3_win32_sleep(wi
f870: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
f880: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
f890: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
f8a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
f8b0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
f8c0: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45  Error ){.    *pE
f8d0: 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20  rror = e;.  }.  
f8e0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
f8f0: 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72  ** Log a I/O err
f900: 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65  or retry episode
f910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f920: 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74   winLogIoerr(int
f930: 20 6e 52 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e   nRetry, int lin
f940: 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65 74  eno){.  if( nRet
f950: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
f960: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
f970: 49 43 45 2c 0a 20 20 20 20 20 20 22 64 65 6c 61  ICE,.      "dela
f980: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
f990: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
f9a0: 63 74 20 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a  ct at line %d",.
f9b0: 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65        winIoerrRe
f9c0: 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a  tryDelay*nRetry*
f9d0: 28 6e 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69  (nRetry+1)/2, li
f9e0: 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  neno.    );.  }.
f9f0: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
fa00: 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  _WINCE./********
fa10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fa50: 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
fa60: 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
fa70: 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
fa80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
fa90: 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41  SQLITE_MSVC_LOCA
faa0: 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53  LTIME_API) || !S
fab0: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
fac0: 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54  TIME_API./*.** T
fad0: 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57  he MSVC CRT on W
fae0: 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f  indows CE may no
faf0: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
fb00: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
fb10: 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73  So.** create a s
fb20: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
fb30: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
fb40: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
fb50: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
fb60: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
fb70: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
fb80: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
fb90: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
fba0: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
fbb0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
fbc0: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
fbd0: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
fbe0: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
fbf0: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
fc00: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
fc10: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
fc20: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
fc30: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
fc40: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
fc50: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
fc60: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
fc70: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
fc80: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
fc90: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
fca0: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
fcb0: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
fcc0: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
fcd0: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
fce0: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
fcf0: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
fd00: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
fd10: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
fd20: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
fd30: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
fd40: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
fd50: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
fd60: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
fd70: 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  f..#define HANDL
fd80: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
fd90: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
fda0: 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
fdb0: 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
fdc0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
fdd0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
fde0: 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
fdf0: 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
fe00: 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
fe10: 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
fe20: 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
fe30: 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
fe40: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
fe50: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
fe60: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
fe70: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
fe80: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
fe90: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
fea0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
feb0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
fec0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
fed0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
fee0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
fef0: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
ff00: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
ff10: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
ff20: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
ff30: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
ff40: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
ff50: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
ff60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63  .static int winc
ff70: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
ff80: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
ff90: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
ffa0: 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
ffb0: 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
ffc0: 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  e;.  DWORD lastE
ffd0: 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f  rrno;.  BOOL bLo
ffe0: 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  gged = FALSE;.  
fff0: 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
10000 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69  E;..  zName = wi
10010 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
10020 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
10030 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
10040 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
10050 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
10060 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
10070 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  EM;.  }..  /* In
10080 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
10090 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
100a0 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
100b0 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
100c0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
100d0 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
100e0 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
100f0 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
10100 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
10110 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
10120 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
10130 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
10140 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
10150 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
10160 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
10170 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
10180 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
10190 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
101a0 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
101b0 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
101c0 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
101d0 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
101e0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
101f0 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
10200 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
10210 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
10220 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71  tError();.    sq
10230 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
10240 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
10250 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10260 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
10270 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
102a0 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
102b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
102c0 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
102d0 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
102e0 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
102f0 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
10300 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63  tex);..  /* Sinc
10310 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e  e the names of n
10320 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65  amed mutexes, se
10330 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d  maphores, file m
10340 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a  appings etc are.
10350 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74    ** case-sensit
10360 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74  ive, take advant
10370 61 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75  age of that by u
10380 70 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d  ppercasing the m
10390 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  utex name.  ** a
103a0 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73  nd using that as
103b0 20 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65   the shared file
103c0 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20  mapping name..  
103d0 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72  */.  osCharUpper
103e0 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  W(zName);.  pFil
103f0 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43  e->hShared = osC
10400 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
10410 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  W(INVALID_HANDLE
10420 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20  _VALUE, NULL,.  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10450 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57        PAGE_READW
10460 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28  RITE, 0, sizeof(
10470 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  winceLock),.    
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f      zName);..  /
104b0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
104c0 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
104d0 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
104e0 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
104f0 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74   so it.  ** must
10500 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
10510 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72  ized */.  lastEr
10520 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
10530 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61  rror();.  if (la
10540 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52  stErrno == ERROR
10550 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
10560 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
10570 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
10580 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
10590 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
105a0 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
105b0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
105c0 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
105d0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  t. */.  if( pFil
105e0 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20  e->hShared ){.  
105f0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20    pFile->shared 
10600 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73  = (winceLock*)os
10610 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
10620 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20  ile->hShared,.  
10630 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
10640 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
10650 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
10660 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
10670 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
10680 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
10690 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
106a0 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
106b0 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
106c0 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72  if( !pFile->shar
106d0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
106e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
106f0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
10700 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
10710 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
10720 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10730 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
10740 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
10750 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
10760 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
10770 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
10780 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
10790 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
107a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
107b0 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
107c0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
107d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
107e0 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
107f0 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
10800 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
10810 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  l */.  if( pFile
10820 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20  ->hShared==NULL 
10830 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67  ){.    if( !bLog
10840 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ged ){.      pFi
10850 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
10860 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
10870 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
10880 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
10890 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
108b0 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33  winceCreateLock3
108c0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
108d0 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
108e0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  RUE;.    }.    w
108f0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
10900 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
10910 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
10920 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
10930 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
10940 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
10950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
10960 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OERR;.  }..  /* 
10970 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
10980 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
10990 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
109a0 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74  o */.  if( bInit
109b0 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
109c0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c  File->shared, 0,
109d0 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
109e0 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63  k));.  }..  winc
109f0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
10a00 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
10a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72  ;.}../*.** Destr
10a30 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77  oy the part of w
10a40 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c  inFile that deal
10a50 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63  s with wince loc
10a60 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ks.*/.static voi
10a70 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f  d winceDestroyLo
10a80 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
10a90 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  e){.  if (pFile-
10aa0 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a  >hMutex){.    /*
10ab0 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
10ac0 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
10ad0 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
10ae0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20  e->hMutex);..   
10af0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
10b00 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20  g blocks should 
10b10 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20  probably assert 
10b20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62  in debug mode, b
10b30 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61  ut they.       a
10b40 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e  re to cleanup in
10b50 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20   case any locks 
10b60 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f  remained open */
10b70 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
10b80 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
10b90 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
10ba0 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
10bb0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  -;.    }.    if 
10bc0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
10bd0 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20  eserved){.      
10be0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10bf0 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
10c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10c10 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
10c20 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
10c30 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
10c40 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
10c50 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
10c60 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
10c70 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69  sive){.      pFi
10c80 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
10c90 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
10ca0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
10cb0 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63  -reference and c
10cc0 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66  lose our copy of
10cd0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
10ce0 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ry handle */.   
10cf0 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
10d00 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  le(pFile->shared
10d10 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
10d20 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
10d30 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
10d40 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
10d50 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
10d60 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
10d70 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
10d80 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
10d90 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
10da0 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
10db0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
10dc0 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
10dd0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
10de0 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57  kFile() API of W
10df0 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
10e00 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
10e10 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  ceLockFile(.  LP
10e20 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
10e30 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
10e40 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
10e50 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
10e60 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
10e70 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
10e80 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
10e90 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
10ea0 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
10eb0 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
10ec0 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
10ed0 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
10ee0 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
10ef0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10f00 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
10f10 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
10f20 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
10f30 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
10f40 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
10f50 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
10f60 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
10f70 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
10f80 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
10f90 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
10fa0 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
10fb0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
10fc0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
10fd0 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
10fe0 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
10ff0 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
11000 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
11010 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
11020 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
11030 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
11040 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
11050 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
11060 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11070 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
11080 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
11090 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
110a0 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
110b0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
110c0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
110d0 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
110e0 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
110f0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11100 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11110 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
11120 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
11130 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
11140 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11150 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
11160 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11170 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
11180 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11190 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
111a0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
111b0 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
111c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
111d0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
111e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
111f0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11200 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11210 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
11220 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
11230 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
11240 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
11250 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20  DING_BYTE.      
11260 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
11270 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
11280 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
11290 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
112a0 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
112b0 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
112c0 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
112d0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
112e0 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
112f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11300 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
11310 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
11320 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
11330 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
11340 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11350 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
11360 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
11370 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
11380 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
11390 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
113a0 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
113b0 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
113c0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
113d0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
113e0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
113f0 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b  Reserved == 0) {
11400 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
11410 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
11420 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
11430 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
11440 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
11450 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11460 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11470 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
11480 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
11490 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
114a0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  rn;.}../*.** An 
114b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
114c0 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  f the UnlockFile
114d0 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
114e0 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
114f0 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63   BOOL winceUnloc
11500 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
11510 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
11520 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
11530 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
11540 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
11550 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
11560 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a  tesToUnlockLow,.
11570 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
11580 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
11590 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
115a0 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
115b0 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
115c0 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
115d0 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
115e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
115f0 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
11600 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
11610 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
11620 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
11630 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  );..  if (!pFile
11640 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
11650 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
11660 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
11670 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
11680 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61   Releasing a rea
11690 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65  der lock or an e
116a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
116b0 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
116c0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
116d0 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a  )SHARED_FIRST){.
116e0 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61      /* Did we ha
116f0 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
11700 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20  lock? */.    if 
11710 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
11720 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
11730 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
11740 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
11750 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
11760 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  ED_SIZE);.      
11770 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
11780 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
11790 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
117a0 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
117b0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
117c0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
117d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
117e0 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61  d we just have a
117f0 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f   reader lock? */
11800 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46  .    else if (pF
11810 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
11820 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ers){.      asse
11830 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
11840 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
11850 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
11860 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE.             
11870 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  || nNumberOfByte
11880 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
11890 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  1);.      pFile-
118a0 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
118b0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  --;.      if (pF
118c0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
118d0 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  ers == 0).      
118e0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
118f0 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11900 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s --;.      }.  
11910 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11920 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11930 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
11940 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a  pending lock */.
11950 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
11960 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
11970 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54  WORD)PENDING_BYT
11980 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
11990 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
119a0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
119b0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
119c0 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
119d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
119e0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46  cal.bPending = F
119f0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
11a00 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
11a10 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
11a20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11a30 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  E;.    }.  }.  /
11a40 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
11a50 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  served lock */. 
11a60 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11a70 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11a80 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
11a90 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
11aa0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11ab0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
11ac0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11ad0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
11ae0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
11af0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
11b00 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
11b10 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
11b20 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
11b30 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
11b40 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
11b50 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
11b60 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
11b70 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
11b80 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  Return;.}./*.** 
11b90 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69  End of the speci
11ba0 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63  al code for winc
11bb0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
11c00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11c10 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f  E_OS_WINCE */../
11c20 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65  *.** Lock a file
11c30 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74   region..*/.stat
11c40 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46  ic BOOL winLockF
11c50 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
11c60 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
11c70 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f  flags,.  DWORD o
11c80 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
11c90 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
11ca0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
11cb0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
11cc0 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
11cd0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
11ce0 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
11cf0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
11d00 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
11d10 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
11d20 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
11d30 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
11d40 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
11d50 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b  return winceLock
11d60 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
11d70 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
11d80 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
11d90 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
11da0 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
11db0 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
11dc0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
11dd0 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
11de0 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
11df0 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
11e00 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
11e10 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
11e20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
11e30 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
11e40 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
11e50 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
11e60 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c  leEx(*phFile, fl
11e70 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ags, 0, numBytes
11e80 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
11e90 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
11ea0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
11eb0 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c  sLockFile(*phFil
11ec0 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
11ed0 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74  fsetHigh, numByt
11ee0 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  esLow,.         
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
11f00 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
11f10 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
11f20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  Unlock a file re
11f30 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  gion.. */.static
11f40 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46   BOOL winUnlockF
11f50 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
11f60 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
11f70 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
11f80 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
11f90 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
11fa0 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
11fb0 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
11fc0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
11fd0 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
11fe0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
11ff0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
12000 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
12010 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
12020 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
12030 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  UnlockFile..  */
12040 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55  .  return winceU
12050 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  nlockFile(phFile
12060 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
12070 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12090 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
120a0 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
120b0 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
120c0 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
120d0 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
120e0 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
120f0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
12100 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
12110 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
12120 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
12130 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
12140 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
12150 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70  sUnlockFileEx(*p
12160 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74  hFile, 0, numByt
12170 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
12180 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
12190 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
121a0 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70   osUnlockFile(*p
121b0 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
121c0 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
121d0 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
121e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121f0 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
12200 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
12210 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
12220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
12260 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
12270 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70   of routines imp
12280 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d  lement the I/O m
12290 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64  ethods specified
122a0 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74  .** by the sqlit
122b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
122c0 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ject..**********
122d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
122f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12310 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  ****/../*.** Som
12320 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
12330 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
12340 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
12350 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53  ifndef INVALID_S
12360 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
12370 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44  # define INVALID
12380 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
12390 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  R ((DWORD)-1).#e
123a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
123b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
123c0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ition of the fil
123d0 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
123e0 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
123f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
12400 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
12410 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
12420 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
12430 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  n 0..** Otherwis
12440 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61  e, set pFile->la
12450 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75  stErrno and retu
12460 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
12470 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
12480 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  ekFile(winFile *
12490 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
124a0 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23  nt64 iOffset){.#
124b0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
124c0 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  NRT.  LONG upper
124d0 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
124e0 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
124f0 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
12500 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
12510 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12530 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
12540 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
12550 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
12560 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
12570 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
12580 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
12590 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
125a0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
125b0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
125c0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
125d0 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
125e0 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52  ror() */..  OSTR
125f0 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
12600 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c  %p, offset=%lld\
12610 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f  n", pFile->h, iO
12620 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65  ffset));..  uppe
12630 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
12640 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
12650 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
12660 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
12670 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
12680 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
12690 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
126a0 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
126b0 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
126c0 73 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63  s a dword.  ** c
126d0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
126e0 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
126f0 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
12700 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
12710 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
12720 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
12730 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
12740 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
12750 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49   to MSDN,.  ** I
12760 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
12770 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f  POINTER may also
12780 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20   be a valid new 
12790 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65  offset. So to de
127a0 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65  termine.  ** whe
127b0 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61  ther an error ha
127c0 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72  s actually occur
127d0 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20  red, it is also 
127e0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c  necessary to cal
127f0 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72  l.  ** GetLastEr
12800 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77  ror()..  */.  dw
12810 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
12820 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c  ointer(pFile->h,
12830 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70   lowerBits, &upp
12840 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47  erBits, FILE_BEG
12850 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52  IN);..  if( (dwR
12860 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  et==INVALID_SET_
12870 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20  FILE_POINTER.   
12880 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
12890 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
128a0 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
128b0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
128c0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
128d0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
128e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
128f0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
12900 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
12910 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12920 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
12930 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
12940 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
12950 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12960 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
12970 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
12980 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
12990 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
129a0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
129b0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
129c0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
129d0 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a  .#else.  /*.  **
129e0 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20   Same as above, 
129f0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73  except that this
12a00 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12a10 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e  works for WinRT.
12a20 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49  .  */..  LARGE_I
12a30 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20  NTEGER x;       
12a40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12a50 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
12a60 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20  BOOL bRet;      
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
12a90 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
12aa0 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e  terEx() */..  x.
12ab0 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73  QuadPart = iOffs
12ac0 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53  et;.  bRet = osS
12ad0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
12ae0 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20  pFile->h, x, 0, 
12af0 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
12b00 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70  if(!bRet){.    p
12b10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
12b20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
12b30 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
12b40 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12b50 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
12b60 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12b70 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
12b80 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
12b90 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
12ba0 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12bb0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
12bc0 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
12bd0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
12be0 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
12bf0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
12c00 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
12c10 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
12c20 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
12c30 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ndif.}..#if SQLI
12c40 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12c50 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  >0./* Forward re
12c60 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
12c70 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75  helper methods u
12c80 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d  sed for memory m
12c90 61 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73  apped files */.s
12ca0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70  tatic int winMap
12cb0 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73  file(winFile*, s
12cc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73  qlite3_int64);.s
12cd0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d  tatic int winUnm
12ce0 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29  apfile(winFile*)
12cf0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
12d00 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
12d10 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
12d20 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
12d30 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
12d40 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
12d50 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
12d60 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
12d70 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
12d80 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69  t, but Windows i
12d90 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
12da0 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
12db0 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
12dc0 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
12dd0 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
12de0 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
12df0 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
12e00 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
12e10 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
12e20 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
12e30 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
12e40 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
12e50 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
12e60 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
12e70 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
12e80 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
12e90 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
12ea0 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
12eb0 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
12ec0 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
12ed0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
12ee0 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
12ef0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
12f00 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
12f10 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
12f20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12f30 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65  _OMIT_WAL.  asse
12f40 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
12f50 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  =0 );.#endif.  a
12f60 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21  ssert( pFile->h!
12f70 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e  =NULL && pFile->
12f80 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
12f90 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54  E_VALUE );.  OST
12fa0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64  RACE(("CLOSE pid
12fb0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
12fc0 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  file=%p\n",.    
12fd0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
12fe0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
12ff0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
13000 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
13010 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
13020 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
13030 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ile);.#endif..  
13040 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43  do{.    rc = osC
13050 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
13060 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
13070 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
13080 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
13090 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
130a0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
130b0 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
130c0 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
130d0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
130e0 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
130f0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13100 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
13110 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
13120 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73  PTS 3.  winceDes
13130 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
13140 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
13150 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
13160 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
13170 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
13180 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
13190 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
131a0 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
131b0 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
131c0 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
131d0 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
131e0 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
131f0 66 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74  f.        && cnt
13200 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54  ++ < WINCE_DELET
13210 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20  ION_ATTEMPTS.   
13220 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
13230 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
13240 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20  00);  /* Wait a 
13250 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72  little before tr
13260 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20  ying again */.  
13270 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
13280 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  free(pFile->zDel
13290 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d  eteOnClose);.  }
132a0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
132b0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68   ){.    pFile->h
132c0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f   = NULL;.  }.  O
132d0 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
132e0 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53    OSTRACE(("CLOS
132f0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
13300 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
13310 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
13320 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
13330 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
13340 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20  e, pFile->h, rc 
13350 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
13360 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
13370 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20   ? SQLITE_OK.   
13380 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f           : winLo
13390 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
133a0 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74  ERR_CLOSE, osGet
133b0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133d0 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65         "winClose
133e0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
133f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
13400 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
13410 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
13420 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
13430 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
13440 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
13450 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
13460 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
13470 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
13480 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
13490 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71  nt winRead(.  sq
134a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
134b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
134c0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
134d0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
134f0 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69   Write content i
13500 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
13510 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13530 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
13540 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  es to read */.  
13550 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
13560 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65  fset       /* Be
13570 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74  gin reading at t
13580 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b  his offset */.){
13590 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
135a0 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
135b0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
135c0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
135d0 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
135e0 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
135f0 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
13600 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
13610 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
13620 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
13630 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
13640 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
13650 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
13660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13670 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
13680 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
13690 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
136a0 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
136b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
136c0 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
136d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
136e0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
136f0 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65   amt>0 );.  asse
13700 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
13710 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
13720 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
13730 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20  _IOERR_READ);.  
13740 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
13750 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
13760 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65  , file=%p, buffe
13770 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  r=%p, amount=%d,
13780 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f   ".           "o
13790 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b  ffset=%lld, lock
137a0 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  =%d\n", osGetCur
137b0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
137c0 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
137d0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75     pFile->h, pBu
137e0 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20  f, amt, offset, 
137f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
13800 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
13810 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
13820 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
13830 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65   much of this re
13840 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  ad request as po
13850 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
13860 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
13870 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
13880 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
13890 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
138a0 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
138b0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
138c0 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
138d0 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
138e0 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
138f0 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
13900 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
13910 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d  on))[offset], am
13920 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  t);.      OSTRAC
13930 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 70 69  E(("READ-MMAP pi
13940 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
13950 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
13960 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
13970 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13980 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
13990 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
139a0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
139b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
139c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
139d0 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29  nt nCopy = (int)
139e0 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  (pFile->mmapSize
139f0 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20   - offset);.    
13a00 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
13a10 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
13a20 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
13a30 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
13a40 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
13a50 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
13a60 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
13a70 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
13a80 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
13a90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
13aa0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13ab0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
13ac0 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
13ad0 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20 77 69  LAPPED).  if( wi
13ae0 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
13af0 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
13b00 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
13b10 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
13b20 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
13b30 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20  LITE_FULL\n",.  
13b40 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
13b50 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
13b60 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
13b70 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
13b80 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
13b90 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52   }.  while( !osR
13ba0 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
13bb0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
13bc0 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65  ead, 0) ){.#else
13bd0 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c  .  memset(&overl
13be0 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
13bf0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
13c00 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
13c10 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
13c20 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
13c30 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
13c40 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
13c50 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
13c60 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
13c70 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46   while( !osReadF
13c80 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42  ile(pFile->h, pB
13c90 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c  uf, amt, &nRead,
13ca0 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26   &overlapped) &&
13cb0 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c  .         osGetL
13cc0 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f  astError()!=ERRO
13cd0 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a  R_HANDLE_EOF ){.
13ce0 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44  #endif.    DWORD
13cf0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13d00 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  if( winRetryIoer
13d10 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
13d20 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
13d30 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
13d40 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
13d50 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
13d60 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c  (("READ pid=%lu,
13d70 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
13d80 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
13d90 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20  ERR_READ\n",.   
13da0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13db0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
13dc0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
13dd0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13de0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
13df0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20  ITE_IOERR_READ, 
13e00 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13e10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13e20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61           "winRea
13e30 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
13e40 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49  );.  }.  winLogI
13e50 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c  oerr(nRetry, __L
13e60 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 6e 52  INE__);.  if( nR
13e70 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29  ead<(DWORD)amt )
13e80 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  {.    /* Unread 
13e90 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
13ea0 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
13eb0 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
13ec0 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
13ed0 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20  Buf)[nRead], 0, 
13ee0 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20  amt-nRead);.    
13ef0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
13f00 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
13f10 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
13f20 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
13f30 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20  _READ\n",.      
13f40 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
13f50 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13f60 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
13f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13f80 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
13f90 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _READ;.  }..  OS
13fa0 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64  TRACE(("READ pid
13fb0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
13fc0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13fd0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
13fe0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
13ff0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
14000 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
14010 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14020 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
14030 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
14040 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
14050 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
14060 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
14070 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
14080 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
14090 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
140a0 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
140b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
140c0 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
140d0 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
140e0 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
140f0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
14100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14110 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
14120 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
14130 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14150 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
14160 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
14170 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
14180 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
14190 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
141a0 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
141b0 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
141c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
141d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
141f0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
14200 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
14210 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14220 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14230 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
14240 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
14250 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14260 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14270 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
14280 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
14290 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
142a0 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
142b0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
142c0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
142d0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
142e0 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
142f0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
14300 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
14310 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
14320 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62  e=%p, file=%p, b
14330 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
14340 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
14350 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20    "offset=%lld, 
14360 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65  lock=%d\n", osGe
14370 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14380 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20  d(), pFile,.    
14390 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
143a0 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
143b0 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
143c0 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
143d0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
143e0 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
143f0 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
14400 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
14410 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
14420 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
14430 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
14440 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
14450 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
14460 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
14470 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
14480 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
14490 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
144a0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
144b0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
144c0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
144d0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
144e0 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f  f, amt);.      O
144f0 53 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d  STRACE(("WRITE-M
14500 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
14510 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14520 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
14530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14540 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
14550 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
14560 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
14570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14580 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
14590 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
145a0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
145b0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
145c0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
145d0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
145e0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
145f0 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79  et], pBuf, nCopy
14600 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
14610 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
14620 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
14630 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
14640 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
14650 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
14660 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
14670 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65  _WINCE || define
14680 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
14690 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
146a0 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65  rc = winSeekFile
146b0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b  (pFile, offset);
146c0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
146d0 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66  #else.  {.#endif
146e0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
146f0 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
14700 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
14710 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
14720 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
14730 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
14740 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
14750 72 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a  r WriteFile. */.
14760 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61  #endif.    u8 *a
14770 52 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66  Rem = (u8 *)pBuf
14780 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
14790 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
147a0 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  en */.    int nR
147b0 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20  em = amt;       
147c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
147d0 72 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74  r of bytes yet t
147e0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
147f0 20 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65      DWORD nWrite
14800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14810 20 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74    /* Bytes writt
14820 65 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65  en by each Write
14830 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20  File() call */. 
14840 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
14850 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20  no = NO_ERROR;  
14860 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
14870 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
14880 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51  or() */..#if !SQ
14890 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
148a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
148b0 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
148c0 50 50 45 44 29 0a 20 20 20 20 6d 65 6d 73 65 74  PPED).    memset
148d0 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
148e0 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
148f0 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61  ED));.    overla
14900 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
14910 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
14920 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f  ffffffff);.    o
14930 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
14940 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
14950 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
14960 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
14970 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65  ..    while( nRe
14980 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  m>0 ){.#if SQLIT
14990 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65  E_OS_WINCE || de
149a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
149b0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
149c0 29 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  ).      if( !osW
149d0 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
149e0 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
149f0 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65  nWrite, 0) ){.#e
14a00 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f  lse.      if( !o
14a10 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
14a20 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
14a30 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c   &nWrite, &overl
14a40 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66  apped) ){.#endif
14a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e  .        if( win
14a60 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74  RetryIoerr(&nRet
14a70 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  ry, &lastErrno) 
14a80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
14a90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14aa0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
14ab0 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
14ac0 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65  rite<=(DWORD)nRe
14ad0 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  m );.      if( n
14ae0 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69  Write==0 || nWri
14af0 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  te>(DWORD)nRem )
14b00 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
14b10 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
14b20 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
14b30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
14b40 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
14b50 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28  NCE && !defined(
14b60 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
14b70 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20  OVERLAPPED).    
14b80 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69    offset += nWri
14b90 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  te;.      overla
14ba0 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
14bb0 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
14bc0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  ffffffff);.     
14bd0 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
14be0 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
14bf0 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
14c00 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
14c10 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  if.      aRem +=
14c20 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
14c30 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
14c40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
14c50 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
14c60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14c70 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
14c80 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
14c90 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
14ca0 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c      if(   ( pFil
14cb0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
14cc0 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f  ROR_HANDLE_DISK_
14cd0 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c  FULL ).       ||
14ce0 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
14cf0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f  rno==ERROR_DISK_
14d00 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f  FULL )){.      O
14d10 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70  STRACE(("WRITE p
14d20 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
14d30 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
14d40 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20  LITE_FULL\n",.  
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
14d60 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14d70 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14d80 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
14d90 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
14da0 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70  r(SQLITE_FULL, p
14db0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
14dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14dd0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72            "winWr
14de0 69 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ite1", pFile->zP
14df0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
14e00 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
14e10 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14e20 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14e30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
14e40 45 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  E\n",.          
14e50 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
14e60 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
14e70 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
14e80 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
14e90 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
14ea0 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d  RR_WRITE, pFile-
14eb0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ed0 20 20 20 22 77 69 6e 57 72 69 74 65 32 22 2c 20     "winWrite2", 
14ee0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c   }else{.    winL
14f00 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20  ogIoerr(nRetry, 
14f10 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20  __LINE__);.  }. 
14f20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
14f30 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
14f40 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
14f50 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
14f60 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
14f70 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
14f80 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
14f90 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
14fa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14fb0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
14fc0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
14fd0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
14fe0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
14ff0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
15000 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
15010 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
15020 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
15030 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
15040 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
15050 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
15060 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15080 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
15090 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
150a0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
150b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
150c0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
150d0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
150e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
150f0 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  CATE);.  OSTRACE
15100 28 28 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d  (("TRUNCATE pid=
15110 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
15120 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c  ile=%p, size=%ll
15130 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  d, lock=%d\n",. 
15140 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
15150 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
15160 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
15170 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65  >h, nByte, pFile
15180 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20  ->locktype));.. 
15190 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20   /* If the user 
151a0 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61  has configured a
151b0 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20   chunk-size for 
151c0 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63  this file, trunc
151d0 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c  ate the.  ** fil
151e0 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  e so that it con
151f0 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65  sists of an inte
15200 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  ger number of ch
15210 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20  unks (i.e. the. 
15220 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20   ** actual file 
15230 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f  size after the o
15240 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20  peration may be 
15250 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
15260 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73  requested.  ** s
15270 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ize)..  */.  if(
15280 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
15290 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d  0 ){.    nByte =
152a0 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65   ((nByte + pFile
152b0 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70  ->szChunk - 1)/p
152c0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a  File->szChunk) *
152d0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b   pFile->szChunk;
152e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e  .  }..  /* SetEn
152f0 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e  dOfFile() return
15300 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20  s non-zero when 
15310 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a  successful, or z
15320 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c  ero when it fail
15330 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53  s. */.  if( winS
15340 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e  eekFile(pFile, n
15350 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20  Byte) ){.    rc 
15360 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
15370 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
15380 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
15390 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
153a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
153b0 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c  Truncate1", pFil
153c0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
153d0 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45  se if( 0==osSetE
153e0 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ndOfFile(pFile->
153f0 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  h) &&.          
15400 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20    ((lastErrno = 
15410 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
15420 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41  )!=ERROR_USER_MA
15430 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20  PPED_FILE) ){.  
15440 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15450 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
15460 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
15470 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
15480 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
15490 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32     "winTruncate2
154c0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
154d0 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ;.  }..#if SQLIT
154e0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
154f0 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  0.  /* If the fi
15500 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  le was truncated
15510 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
15520 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15530 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65  ently.  ** mappe
15540 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65  d region, reduce
15550 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d   the effective m
15560 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77  apping size as w
15570 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c  ell. SQLite will
15580 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29  .  ** use read()
15590 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20   and write() to 
155a0 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f  access data beyo
155b0 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72  nd this point fr
155c0 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a  om now on..  */.
155d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61    if( pFile->pMa
155e0 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65  pRegion && nByte
155f0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
15600 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   ){.    pFile->m
15610 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b  mapSize = nByte;
15620 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
15630 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
15640 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
15650 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
15660 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
15670 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
15680 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
15690 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  e, pFile->h, sql
156a0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
156b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
156c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
156d0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  _TEST./*.** Coun
156e0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
156f0 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f  fullsyncs and no
15700 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69  rmal syncs.  Thi
15710 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
15720 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20  t.** that syncs 
15730 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72  and fullsyncs ar
15740 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68  e occuring at th
15750 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
15760 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
15770 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
15780 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
15790 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
157a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
157b0 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
157c0 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
157d0 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
157e0 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ted to disk..*/.
157f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79  static int winSy
15800 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
15810 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
15820 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15830 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a  NO_SYNC.  /*.  *
15840 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e  * Used only when
15850 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
15860 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a  is not defined..
15870 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b     */.  BOOL rc;
15880 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
15890 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
158a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
158b0 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20  NO_SYNC) || \.  
158c0 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45    defined(SQLITE
158d0 5f 57 49 4e 33 32 5f 48 41 53 5f 4f 53 5f 54 52  _WIN32_HAS_OS_TR
158e0 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  ACE).  /*.  ** U
158f0 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
15900 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
15910 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
15920 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
15930 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
15940 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
15950 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
15960 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
15970 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
15980 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
15990 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
159a0 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
159b0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
159c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
159d0 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
159e0 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
159f0 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
15a00 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
15a10 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
15a20 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
15a30 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
15a40 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
15a50 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
15a60 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
15a70 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
15a80 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
15a90 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
15aa0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
15ab0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
15ac0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
15ad0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
15ae0 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
15af0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
15b00 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
15b10 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
15b20 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61  %p, file=%p, fla
15b30 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  gs=%x, lock=%d\n
15b40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
15b50 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15b60 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15b70 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20  ile->h, flags,. 
15b80 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15b90 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
15ba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  fndef SQLITE_TES
15bb0 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  T.  UNUSED_PARAM
15bc0 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c  ETER(flags);.#el
15bd0 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26  se.  if( (flags&
15be0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
15bf0 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
15c00 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
15c10 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
15c20 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
15c30 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
15c40 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
15c50 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
15c60 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
15c70 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
15c80 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
15c90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
15ca0 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45  O_SYNC.  OSTRACE
15cb0 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d  (("SYNC-NOP pid=
15cc0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
15cd0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15ce0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
15cf0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
15d00 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
15d10 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
15d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15d30 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  OK;.#else.  rc =
15d40 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
15d50 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
15d60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15d70 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
15d80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53  if( rc ){.    OS
15d90 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64  TRACE(("SYNC pid
15da0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
15db0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15dc0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
15dd0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
15de0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
15df0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
15e00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15e10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
15e20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
15e30 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
15e40 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f  stError();.    O
15e50 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69  STRACE(("SYNC pi
15e60 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
15e70 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15e80 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c  ITE_IOERR_FSYNC\
15e90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15ea0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
15eb0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15ec0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15ed0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
15ee0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
15ef0 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
15f00 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f20 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
15f30 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
15f40 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
15f50 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
15f60 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
15f70 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
15f80 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
15f90 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
15fa0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
15fb0 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
15fc0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
15fd0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
15fe0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15ff0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
16000 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
16010 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b  ert( pSize!=0 );
16020 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
16030 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
16040 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
16050 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
16060 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
16070 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
16080 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51  pSize));..#if SQ
16090 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
160a0 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44  {.    FILE_STAND
160b0 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20  ARD_INFO info;. 
160c0 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65     if( osGetFile
160d0 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
160e0 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  dleEx(pFile->h, 
160f0 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f  FileStandardInfo
16100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69         &info, si
16130 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20  zeof(info)) ){. 
16140 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e       *pSize = in
16150 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61  fo.EndOfFile.Qua
16160 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  dPart;.    }else
16170 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
16180 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
16190 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
161a0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
161b0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
161c0 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
161d0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
16200 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
16210 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
16220 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70   {.    DWORD upp
16230 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
16240 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  D lowerBits;.   
16250 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
16260 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73  ;..    lowerBits
16270 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65   = osGetFileSize
16280 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65  (pFile->h, &uppe
16290 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69  rBits);.    *pSi
162a0 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
162b0 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
162c0 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
162d0 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f  s;.    if(   (lo
162e0 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c  werBits == INVAL
162f0 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20  ID_FILE_SIZE).  
16300 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
16310 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
16320 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
16330 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  R) ){.      pFil
16340 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
16350 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
16360 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
16370 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
16380 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
16390 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
163b0 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
163c0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
163d0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  }.  }.#endif.  O
163e0 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
163f0 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c  le=%p, pSize=%p,
16400 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63   *pSize=%lld, rc
16410 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
16420 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69     pFile->h, pSi
16430 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69  ze, *pSize, sqli
16440 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
16450 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16460 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
16470 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
16480 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
16490 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
164a0 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
164b0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
164c0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
164d0 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
164e0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
164f0 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  1.#endif..#ifnde
16500 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  f LOCKFILE_EXCLU
16510 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  SIVE_LOCK.# defi
16520 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ne LOCKFILE_EXCL
16530 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e  USIVE_LOCK 2.#en
16540 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f  dif../*.** Histo
16550 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20  rically, SQLite 
16560 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68  has used both th
16570 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c  e LockFile and L
16580 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
16590 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ons..** When the
165a0 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69   LockFile functi
165b0 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20  on was used, it 
165c0 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63  was always expec
165d0 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69  ted to fail.** i
165e0 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
165f0 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  e lock could not
16600 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41   be obtained.  A
16610 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65  lso, it always e
16620 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62  xpected to.** ob
16630 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
16640 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66  e lock.  These f
16650 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69  lags are used wi
16660 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  th the LockFileE
16670 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e  x function.** an
16680 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20  d reflect those 
16690 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68  expectations; th
166a0 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68  erefore, they sh
166b0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e  ould not be chan
166c0 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ged..*/.#ifndef 
166d0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
166e0 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
166f0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
16700 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45  LAGS   (LOCKFILE
16710 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
16720 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  Y | \.          
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16740 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45          LOCKFILE
16750 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  _EXCLUSIVE_LOCK)
16760 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
16770 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65  urrently, SQLite
16780 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65   never calls the
16790 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
167a0 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e  tion without wan
167b0 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ting the.** call
167c0 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61   to fail immedia
167d0 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
167e0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
167f0 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
16800 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
16810 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  X_FLAGS.# define
16820 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16830 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49  EX_FLAGS (LOCKFI
16840 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
16850 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ELY).#endif../*.
16860 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
16870 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
16880 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
16890 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
168a0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
168b0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
168c0 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57  ** is Win9x or W
168d0 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
168e0 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  int winGetReadLo
168f0 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
16900 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
16910 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
16920 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
16930 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
16940 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
16950 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
16960 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
16970 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
16980 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
16990 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
169a0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
169b0 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
169c0 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
169d0 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  2.    **       A
169e0 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20  PI LockFileEx.. 
169f0 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20     */.    res = 
16a00 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70  winceLockFile(&p
16a10 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
16a20 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
16a30 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d  .#else.    res =
16a40 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
16a50 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
16a60 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
16a70 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
16a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16a90 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
16aa0 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  IZE, 0);.#endif.
16ab0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
16ac0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
16ad0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
16ae0 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
16af0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
16b00 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
16b10 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
16b20 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
16b30 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
16b40 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
16b50 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
16b60 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
16b70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
16b80 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ba0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
16bb0 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
16bc0 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
16bd0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
16be0 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
16bf0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
16c00 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
16c10 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
16c20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
16c30 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
16c40 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41  k */.  }.  OSTRA
16c50 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66  CE(("READ-LOCK f
16c60 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
16c70 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
16c80 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  res));.  return 
16c90 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  res;.}../*.** Un
16ca0 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f  do a readlock.*/
16cb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
16cc0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
16cd0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
16ce0 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52   int res;.  DWOR
16cf0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f  D lastErrno;.  O
16d00 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e  STRACE(("READ-UN
16d10 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
16d20 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
16d30 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
16d40 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
16d50 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73  sNT() ){.    res
16d60 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
16d70 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
16d80 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
16d90 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
16da0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
16db0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
16dc0 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d   else{.    res =
16dd0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
16de0 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
16df0 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
16e00 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
16e10 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
16e20 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  if.  if( res==0 
16e30 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
16e40 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16e50 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f  ))!=ERROR_NOT_LO
16e60 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69  CKED) ){.    pFi
16e70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16e80 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
16e90 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
16ea0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
16eb0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16ed0 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64    "winUnlockRead
16ee0 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Lock", pFile->zP
16ef0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  ath);.  }.  OSTR
16f00 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43  ACE(("READ-UNLOC
16f10 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
16f20 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%d\n", pFile->
16f30 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75  h, res));.  retu
16f40 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
16f50 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
16f60 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
16f70 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
16f80 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
16f90 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
16fa0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
16fb0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
16fc0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
16fd0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
16fe0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
16ff0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
17000 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
17010 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
17020 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
17030 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
17040 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
17050 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
17060 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
17070 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
17080 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
17090 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
170a0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
170b0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
170c0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
170d0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
170e0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
170f0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
17100 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
17110 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
17120 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
17130 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
17140 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
17150 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
17160 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
17170 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
17180 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
17190 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
171a0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
171b0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
171c0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
171d0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
171e0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
171f0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
17200 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17210 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
17220 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20  se a lock.  The 
17230 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  winUnlock() rout
17240 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c  ine.** erases al
17250 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20  l locks at once 
17260 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69  and returns us i
17270 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f  mmediately to lo
17280 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
17290 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
172a0 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68  ible to lower th
172b0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
172c0 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69  one step at a ti
172d0 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74  me.  You.** must
172e0 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20   go straight to 
172f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
17300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
17310 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  inLock(sqlite3_f
17320 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
17330 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
17340 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
17350 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17360 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73  from subroutines
17370 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
17380 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
17390 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64  Result of a Wind
173a0 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f  ows lock call */
173b0 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79  .  int newLockty
173c0 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74  pe;       /* Set
173d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
173e0 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62   to this value b
173f0 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
17400 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e  .  int gotPendin
17410 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75  gLock = 0;/* Tru
17420 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64  e if we acquired
17430 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
17440 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77  this time */.  w
17450 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
17460 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
17470 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
17480 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61  = NO_ERROR;..  a
17490 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
174a0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
174b0 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63   file=%p, oldLoc
174c0 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63  k=%d(%d), newLoc
174d0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
174e0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
174f0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
17500 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
17510 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29  Byte, locktype))
17520 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
17530 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
17540 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
17550 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
17560 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
17570 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
17580 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
17590 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
175a0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
175b0 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
175c0 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
175d0 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
175e0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
175f0 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
17600 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  e ){.    OSTRACE
17610 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c  (("LOCK-HELD fil
17620 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
17630 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
17640 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17650 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
17660 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
17670 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
17680 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
17690 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
176a0 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
176b0 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
176c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
176d0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
176e0 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
176f0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
17700 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
17710 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
17720 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
17730 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
17740 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47  Lock the PENDING
17750 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65  _LOCK byte if we
17760 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65   need to acquire
17770 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
17780 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  or.  ** a SHARED
17790 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72   lock.  If we ar
177a0 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
177b0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61  ARED lock, the a
177c0 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20  cquisition of.  
177d0 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ** the PENDING_L
177e0 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70  OCK byte is temp
177f0 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65  orary..  */.  ne
17800 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c  wLocktype = pFil
17810 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
17820 66 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63  f(   (pFile->loc
17830 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a  ktype==NO_LOCK).
17840 20 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63       || (   (loc
17850 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
17860 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
17870 26 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  && (pFile->lockt
17880 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
17890 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e  CK)).  ){.    in
178a0 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77  t cnt = 3;.    w
178b0 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26  hile( cnt-->0 &&
178c0 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46   (res = winLockF
178d0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
178e0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
178f0 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
17920 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
17930 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  1, 0))==0 ){.   
17940 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65     /* Try 3 time
17950 73 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e  s to get the pen
17960 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73  ding lock.  This
17970 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f   is needed to wo
17980 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75  rk.      ** arou
17990 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73  nd problems caus
179a0 65 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61  ed by indexing a
179b0 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73  nd/or anti-virus
179c0 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20   software on.   
179d0 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79     ** Windows sy
179e0 73 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20  stems..      ** 
179f0 49 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67  If you are using
17a00 20 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20   this code as a 
17a10 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e  model for altern
17a20 61 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20  ative VFSes, do 
17a30 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  not.      ** cop
17a40 79 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67  y this retry log
17a50 69 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63  ic.  It is a hac
17a60 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57  k intended for W
17a70 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20  indows only..   
17a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74     */.      last
17a90 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
17aa0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
17ab0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50  OSTRACE(("LOCK-P
17ac0 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65  ENDING-FAIL file
17ad0 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72  =%p, count=%d, r
17ae0 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20  esult=%d\n",.   
17af0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
17b00 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29 29  e->h, cnt, res))
17b10 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74  ;.      if( last
17b20 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56  Errno==ERROR_INV
17b30 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20  ALID_HANDLE ){. 
17b40 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
17b50 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
17b60 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rno;.        rc 
17b70 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
17b80 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  OCK;.        OST
17b90 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c  RACE(("LOCK-FAIL
17ba0 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d   file=%p, count=
17bb0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17bd0 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71  File->h, cnt, sq
17be0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
17bf0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
17c00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
17c10 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73       if( cnt ) s
17c20 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
17c30 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
17c40 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
17c50 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
17c60 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
17c70 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17c80 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
17c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
17ca0 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
17cb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
17cc0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
17cd0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
17ce0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
17cf0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
17d00 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
17d10 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
17d20 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  le);.    if( res
17d30 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
17d40 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
17d50 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
17d60 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
17d70 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
17d80 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
17d90 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45   /* Acquire a RE
17da0 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f  SERVED lock.  */
17db0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
17dc0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
17dd0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
17de0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
17df0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
17e00 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
17e10 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
17e20 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
17e30 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53  KFILE_FLAGS, RES
17e40 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
17e50 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
17e60 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
17e70 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45  cktype = RESERVE
17e80 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
17e90 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
17ea0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
17eb0 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
17ec0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
17ed0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
17ee0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
17ef0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
17f00 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
17f10 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
17f20 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
17f30 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
17f40 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
17f50 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
17f60 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
17f70 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
17f80 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
17f90 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
17fa0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
17fb0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
17fc0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  ;.    res = winU
17fd0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
17fe0 69 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  ile);.    res = 
17ff0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
18000 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
18010 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48  CKFILE_FLAGS, SH
18020 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
18050 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
18060 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
18070 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
18080 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
18090 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
180a0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
180b0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
180c0 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69  nGetReadLock(pFi
180d0 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
180e0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
180f0 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
18100 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
18110 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
18120 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
18130 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
18140 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
18150 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
18160 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
18170 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
18180 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
18190 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
181a0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
181b0 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
181c0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
181d0 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
181e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
181f0 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
18200 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
18210 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
18220 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
18230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
18250 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
18260 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
18270 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18280 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
18290 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25  LOCK-FAIL file=%
182a0 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f  p, wanted=%d, go
182b0 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
182c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
182d0 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
182e0 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70  ktype));.  }.  p
182f0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
18300 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65   (u8)newLocktype
18310 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
18320 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
18330 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
18340 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
18350 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
18360 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ype, sqlite3ErrN
18370 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
18380 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
183a0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
183b0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
183c0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
183d0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
183e0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
183f0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
18400 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
18410 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e  eld, return.** n
18420 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  on-zero, otherwi
18430 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  se zero..*/.stat
18440 69 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52  ic int winCheckR
18450 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
18460 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18470 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
18480 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c  nt res;.  winFil
18490 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
184a0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
184b0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
184c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
184d0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
184e0 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  CK; );.  OSTRACE
184f0 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
18500 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74  file=%p, pResOut
18510 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
18520 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20  , pResOut));..  
18530 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
18540 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
18550 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44  cktype>=RESERVED
18560 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
18570 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43   = 1;.    OSTRAC
18580 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b  E(("TEST-WR-LOCK
18590 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74   file=%p, result
185a0 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20  =%d (local)\n", 
185b0 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b  pFile->h, res));
185c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
185d0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
185e0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
185f0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
18600 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54 45  GS,RESERVED_BYTE
18610 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
18620 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
18630 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
18640 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
18650 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
18660 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73  );.    }.    res
18670 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f 53 54   = !res;.    OST
18680 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
18690 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
186a0 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c  ult=%d (remote)\
186b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
186c0 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  s));.  }.  *pRes
186d0 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54  Out = res;.  OST
186e0 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
186f0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
18700 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
18710 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
18720 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
18730 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73    pFile->h, pRes
18740 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
18750 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18760 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
18770 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
18780 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
18790 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c  scriptor id to l
187a0 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
187b0 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
187c0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
187d0 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
187e0 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
187f0 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
18800 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
18810 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
18820 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
18830 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
18840 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
18850 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
18860 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  *.** It is not p
18870 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
18880 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c   routine to fail
18890 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
188a0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f  rgument.** is NO
188b0 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73  _LOCK.  If the s
188c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
188d0 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68  s SHARED_LOCK th
188e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
188f0 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ** might return 
18900 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f  SQLITE_IOERR;.*/
18910 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
18920 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
18930 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
18940 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
18950 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  e;.  winFile *pF
18960 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
18970 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
18980 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
18990 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
189a0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
189b0 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
189c0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
189d0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  NLOCK file=%p, o
189e0 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
189f0 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
18a00 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
18a10 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
18a20 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
18a30 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
18a40 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  ype));.  type = 
18a50 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
18a60 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
18a70 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
18a80 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
18a90 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
18aa0 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
18ab0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
18ac0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
18ad0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
18ae0 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
18af0 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
18b00 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
18b10 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
18b20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
18b30 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
18b40 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
18b50 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
18b60 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
18b70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
18b80 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61  _UNLOCK, osGetLa
18b90 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70    "winUnlock", p
18bc0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
18bd0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79    }.  }.  if( ty
18be0 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
18bf0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
18c00 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
18c10 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
18c20 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
18c30 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
18c40 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
18c50 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
18c60 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64     winUnlockRead
18c70 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d  Lock(pFile);.  }
18c80 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
18c90 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
18ca0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
18cb0 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
18cc0 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
18cd0 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
18ce0 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
18cf0 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43  cktype;.  OSTRAC
18d00 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  E(("UNLOCK file=
18d10 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d  %p, lock=%d, rc=
18d20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
18d30 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
18d40 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c  e->locktype, sql
18d50 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
18d60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18d70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
18d80 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  g is initially n
18d90 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
18da0 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
18db0 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
18dc0 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
18dd0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
18de0 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
18df0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
18e00 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
18e10 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
18e20 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
18e30 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
18e40 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
18e50 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
18e60 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77  oid winModeBit(w
18e70 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  inFile *pFile, u
18e80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
18e90 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
18ea0 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
18eb0 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
18ec0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
18ed0 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
18ee0 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
18ef0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
18f00 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
18f10 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
18f20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
18f30 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
18f40 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
18f50 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65  rences to VFS he
18f60 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65  lper methods use
18f70 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
18f80 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  files */.static 
18f90 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
18fa0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
18fb0 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74  , char **);.stat
18fc0 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
18fd0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73  const void *);.s
18fe0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
18ff0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
19000 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lon(const char *
19010 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f  );../*.** Contro
19020 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74  l and query of t
19030 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e  he open file han
19040 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
19050 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f  nt winFileContro
19060 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
19070 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  id, int op, void
19080 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69   *pArg){.  winFi
19090 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
190a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52  File*)id;.  OSTR
190b0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
190c0 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67  =%p, op=%d, pArg
190d0 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
190e0 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20  , op, pArg));.  
190f0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
19100 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19110 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
19120 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
19130 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  rg = pFile->lock
19140 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52  type;.      OSTR
19150 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
19160 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
19170 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
19180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
19190 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
191a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
191b0 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
191c0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
191d0 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
191e0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f  stErrno;.      O
191f0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
19200 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
19210 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
19220 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
19230 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19240 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
19250 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
19260 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
19270 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
19280 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
19290 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
192a0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
192b0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
192c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
192d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
192e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
192f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
19300 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
19310 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
19320 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  k>0 ){.        s
19330 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64  qlite3_int64 old
19340 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Sz;.        int 
19350 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
19360 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20  (id, &oldSz);.  
19370 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19390 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
193a0 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c  64 newSz = *(sql
193b0 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
193c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
193d0 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20  newSz>oldSz ){. 
193e0 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
193f0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
19400 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
19410 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
19420 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20  e(id, newSz);.  
19430 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
19440 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
19450 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
19460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19470 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19480 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
19490 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
194a0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
194b0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
194c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
194d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
194e0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
194f0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
19500 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
19510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19520 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
19530 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
19540 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
19550 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
19560 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
19570 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74  ERSIST_WAL, (int
19580 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f  *)pArg);.      O
19590 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
195a0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
195b0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
195c0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
195d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
195e0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
195f0 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
19600 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
19610 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
19620 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
19630 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
19640 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
19650 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19660 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
19670 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
19680 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19690 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
196a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
196b0 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
196c0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
196d0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
196e0 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d  ntf("%s", pFile-
196f0 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pVfs->zName);. 
19700 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
19710 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19720 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
19730 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
19740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19750 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
19760 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
19770 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b  IN32_AV_RETRY: {
19780 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20  .      int *a = 
19790 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
197a0 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a    if( a[0]>0 ){.
197b0 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
197c0 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
197d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
197e0 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65     a[0] = winIoe
197f0 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
19800 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
19810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
19820 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
19830 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[1];.      }e
19840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31  lse{.        a[1
19850 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72  ] = winIoerrRetr
19860 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a  yDelay;.      }.
19870 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
19880 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
19890 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
198a0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
198b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
198c0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  OK;.    }.#ifdef
198d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
198e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
198f0 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e  TL_WIN32_SET_HAN
19900 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48  DLE: {.      LPH
19910 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20 28  ANDLE phFile = (
19920 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20  LPHANDLE)pArg;. 
19930 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64       HANDLE hOld
19940 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  File = pFile->h;
19950 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  .      pFile->h 
19960 3d 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20 20  = *phFile;.     
19970 20 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46   *phFile = hOldF
19980 69 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ile;.      OSTRA
19990 43 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69  CE(("FCNTL oldFi
199a0 6c 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25  le=%p, newFile=%
199b0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
199c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
199d0 20 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69     hOldFile, pFi
199e0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
199f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19a00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
19a10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
19a20 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
19a30 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
19a40 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20  zTFile = 0;.    
19a50 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65    int rc = winGe
19a60 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
19a70 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b  >pVfs, &zTFile);
19a80 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19aa0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
19ab0 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
19ac0 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
19ad0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19ae0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
19af0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
19b00 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
19b10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19b20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d    }.#if SQLITE_M
19b30 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
19b40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
19b50 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  CNTL_MMAP_SIZE: 
19b60 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c  {.      i64 newL
19b70 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41  imit = *(i64*)pA
19b80 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  rg;.      int rc
19b90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19ba0 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
19bb0 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  >sqlite3GlobalCo
19bc0 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20  nfig.mxMmap ){. 
19bd0 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
19be0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
19bf0 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20  onfig.mxMmap;.  
19c00 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36      }.      *(i6
19c10 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  4*)pArg = pFile-
19c20 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
19c30 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
19c40 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21  >=0 && newLimit!
19c50 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  =pFile->mmapSize
19c60 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46  Max && pFile->nF
19c70 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20  etchOut==0 ){.  
19c80 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
19c90 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69  pSizeMax = newLi
19ca0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mit;.        if(
19cb0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19cc0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
19cd0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
19ce0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  le);.          r
19cf0 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70  c = winMapfile(p
19d00 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
19d10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
19d20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
19d30 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TL file=%p, rc=%
19d40 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
19d50 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
19d60 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
19d70 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e  rn rc;.    }.#en
19d80 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  dif.  }.  OSTRAC
19d90 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
19da0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54  p, rc=SQLITE_NOT
19db0 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d  FOUND\n", pFile-
19dc0 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
19dd0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
19de0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19df0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
19e00 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  in bytes of the 
19e10 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b  underlying block
19e20 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74   device for.** t
19e30 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
19e40 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73  e. This is almos
19e50 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  t always 512 byt
19e60 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a  es, but may be.*
19e70 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d  * larger for som
19e80 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a  e devices..**.**
19e90 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73   SQLite code ass
19ea0 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69  umes this functi
19eb0 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  on cannot fail. 
19ec0 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  It also assumes 
19ed0 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66  that.** if two f
19ee0 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
19ef0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   in the same fil
19f00 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f  e-system directo
19f10 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61  ry (i.e..** a da
19f20 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a  tabase and its j
19f30 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
19f40 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
19f50 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
19f60 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
19f70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
19f80 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  nSectorSize(sqli
19f90 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
19fa0 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74   (void)id;.  ret
19fb0 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55  urn SQLITE_DEFAU
19fc0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
19fd0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
19fe0 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69  a vector of devi
19ff0 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
1a000 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  cs..*/.static in
1a010 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61  t winDeviceChara
1a020 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1a030 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1a040 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69  winFile *p = (wi
1a050 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74  nFile*)id;.  ret
1a060 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
1a070 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45  _UNDELETABLE_WHE
1a080 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20  N_OPEN |.       
1a090 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73    ((p->ctrlFlags
1a0a0 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29   & WINFILE_PSOW)
1a0b0 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f  ?SQLITE_IOCAP_PO
1a0c0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a0d0 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E:0);.}../*.** W
1a0e0 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
1a0f0 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
1a100 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
1a110 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
1a120 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
1a130 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
1a140 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
1a150 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
1a160 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
1a170 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
1a180 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
1a190 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ize..*/.static S
1a1a0 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
1a1b0 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20  sInfo;..#ifndef 
1a1c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1a1d0 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
1a1e0 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
1a1f0 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
1a200 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
1a210 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
1a220 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
1a230 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
1a240 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
1a250 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69  s used by.** thi
1a260 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
1a270 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72  hich may be shar
1a280 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74  ed by multiple t
1a290 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75  hreads..**.** Fu
1a2a0 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74  nction winShmMut
1a2b0 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64  exHeld() is used
1a2c0 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61   to assert() tha
1a2d0 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  t the global mut
1a2e0 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  ex.** is held wh
1a2f0 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
1a300 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
1a310 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
1a320 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  of assert().** s
1a330 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a  tatements. e.g..
1a340 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e  **.**   winShmEn
1a350 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20  terMutex().**   
1a360 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
1a370 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
1a380 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  *   winShmLeaveM
1a390 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63  utex().*/.static
1a3a0 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
1a3b0 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
1a3c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a3d0 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ter(sqlite3Mutex
1a3e0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1a3f0 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
1a400 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
1a410 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
1a420 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
1a430 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1a440 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a450 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a460 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
1a470 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
1a480 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1a490 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
1a4a0 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
1a4b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1a4c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a4d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a4e0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
1a4f0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a500 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
1a510 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
1a520 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
1a530 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
1a540 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
1a550 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
1a560 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
1a570 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
1a580 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
1a590 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
1a5a0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
1a5b0 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
1a5c0 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
1a5d0 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
1a5e0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1a5f0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
1a600 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
1a610 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
1a620 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
1a630 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
1a640 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
1a650 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
1a660 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
1a670 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
1a680 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
1a690 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1a6a0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
1a6b0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
1a6c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
1a6d0 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a  **      pNext.**
1a6e0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1a6f0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
1a700 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
1a710 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1a720 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ed:.**.**      f
1a730 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
1a740 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
1a750 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
1a760 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
1a770 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
1a780 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
1a790 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
1a7a0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
1a7b0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
1a7c0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
1a7d0 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
1a7e0 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
1a7f0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
1a800 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
1a810 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
1a820 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
1a830 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
1a840 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1a850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1a860 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
1a870 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
1a880 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1a890 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
1a8a0 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
1a8b0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a8d0 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
1a8e0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
1a8f0 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a910 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
1a920 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
1a930 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
1a940 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
1a950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a960 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
1a970 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1a980 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
1a990 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
1a9a0 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
1a9b0 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
1a9c0 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
1a9d0 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
1a9e0 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1a9f0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa10 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
1aa20 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
1aa30 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
1aa40 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
1aa50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1aa60 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
1aa70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1aa80 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
1aa90 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
1aaa0 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
1aab0 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
1aac0 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
1aad0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1aae0 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
1aaf0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ab00 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
1ab10 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
1ab20 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1ab30 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
1ab40 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
1ab50 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
1ab60 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
1ab70 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
1ab80 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
1ab90 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1aba0 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
1abb0 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
1abc0 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
1abd0 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
1abe0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
1abf0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
1ac00 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
1ac10 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
1ac20 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
1ac30 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
1ac40 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1ac50 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
1ac60 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
1ac70 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
1ac80 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
1ac90 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
1aca0 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
1acb0 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
1acc0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
1acd0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1ace0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1acf0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
1ad00 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
1ad10 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1ad20 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
1ad30 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
1ad40 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
1ad50 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
1ad60 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1ad70 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
1ad80 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
1ad90 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1ada0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
1adb0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1adc0 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
1add0 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
1ade0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
1adf0 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
1ae00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1ae10 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
1ae20 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
1ae30 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
1ae40 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
1ae50 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
1ae60 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1ae70 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1ae90 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1aea0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
1aeb0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1aec0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1aed0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1aee0 5f 48 41 53 5f 4f 53 5f 54 52 41 43 45 29 0a 20  _HAS_OS_TRACE). 
1aef0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
1af00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1af10 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
1af20 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69  tion with its wi
1af30 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  nShmNode */.#end
1af40 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
1af50 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
1af60 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
1af70 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20  ne WIN_SHM_BASE 
1af80 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1af90 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1afa0 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
1afb0 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
1afc0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20   WIN_SHM_DMS    
1afd0 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51  (WIN_SHM_BASE+SQ
1afe0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
1aff0 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
1b000 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
1b010 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ly advisory lock
1b020 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65  s for all n byte
1b030 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f  s beginning at o
1b040 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  fst..*/.#define 
1b050 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64  _SHM_UNLCK  1.#d
1b060 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b  efine _SHM_RDLCK
1b070 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    2.#define _SHM
1b080 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
1b090 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
1b0a0 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
1b0b0 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
1b0c0 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1b0d0 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1b0e0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1b0f0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1b100 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f  pe,         /* _
1b110 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f  SHM_UNLCK, _SHM_
1b120 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57  RDLCK, or _SHM_W
1b130 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
1b140 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1b150 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
1b160 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
1b170 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
1b180 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
1b190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b1a0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
1b1b0 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
1b1c0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1b1d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1b1e0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
1b1f0 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45  Lock/UnlockFileE
1b200 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  x() */..  /* Acc
1b210 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68  ess to the winSh
1b220 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1b230 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1b240 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1b250 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b260 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
1b270 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d  mutex) || pFile-
1b280 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f  >nRef==0 );..  O
1b290 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1b2a0 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
1b2b0 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1b2c0 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ize=%d\n",.     
1b2d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1b2e0 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20  le.h, lockType, 
1b2f0 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a  ofst, nByte));..
1b300 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
1b310 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
1b320 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
1b330 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
1b340 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
1b350 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  rc = winUnlockFi
1b360 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
1b370 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  .h, ofst, 0, nBy
1b380 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  te, 0);.  }else{
1b390 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1b3a0 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
1b3b0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
1b3c0 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d   DWORD dwFlags =
1b3d0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
1b3e0 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20  MMEDIATELY;.    
1b3f0 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  if( lockType == 
1b400 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46  _SHM_WRLCK ) dwF
1b410 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45  lags |= LOCKFILE
1b420 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b  _EXCLUSIVE_LOCK;
1b430 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
1b440 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
1b450 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20  ile.h, dwFlags, 
1b460 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
1b470 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  0);.  }..  if( r
1b480 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
1b490 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1b4a0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1b4b0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73  >lastErrno =  os
1b4c0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1b4d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1b4e0 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  BUSY;.  }..  OST
1b4f0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1b500 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73  file=%p, func=%s
1b510 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d  , errno=%lu, rc=
1b520 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1b530 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
1b540 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  , (lockType == _
1b550 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69  SHM_UNLCK) ? "wi
1b560 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20  nUnlockFile" :. 
1b570 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f            "winLo
1b580 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ckFile", pFile->
1b590 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74  lastErrno, sqlit
1b5a0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1b5b0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1b5c0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1b5d0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
1b5e0 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1b5f0 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
1b600 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
1b610 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
1b620 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
1b630 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
1b640 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
1b650 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
1b660 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
1b670 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
1b680 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
1b690 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
1b6a0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1b6b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1b6c0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1b6d0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1b6e0 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1b6f0 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1b700 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1b710 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1b720 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1b730 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
1b740 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1b750 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
1b760 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
1b770 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1b780 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
1b790 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
1b7a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1b7b0 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c  M-PURGE pid=%lu,
1b7c0 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e   deleteFlag=%d\n
1b7d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1b7e0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1b7f0 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61  sId(), deleteFla
1b800 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  g));.  pp = &win
1b810 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
1b820 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
1b830 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
1b840 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1b850 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1b860 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73  f( p->mutex ){ s
1b870 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1b880 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20  e(p->mutex); }. 
1b890 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1b8a0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1b8b0 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62  {.        BOOL b
1b8c0 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77  Rc = osUnmapView
1b8d0 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f  OfFile(p->aRegio
1b8e0 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20  n[i].pMap);.    
1b8f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1b900 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69  M-PURGE-UNMAP pi
1b910 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1b920 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1b940 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1b950 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
1b960 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1b970 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
1b980 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
1b990 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52  bRc);.        bR
1b9a0 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
1b9b0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1b9c0 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
1b9d0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1b9e0 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  GE-CLOSE pid=%lu
1b9f0 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1ba00 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1ba10 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1ba20 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ba30 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1ba40 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1ba50 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1ba60 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1ba70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ba80 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e  f( p->hFile.h!=N
1ba90 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e  ULL && p->hFile.
1baa0 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
1bab0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
1bac0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1bad0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1bae0 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
1baf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1bb00 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
1bb10 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1bb20 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1bb30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
1bb40 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
1bb50 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1bb60 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1bb70 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1bb80 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
1bb90 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
1bba0 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
1bbb0 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
1bbc0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
1bbd0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1bbe0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1bbf0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1bc00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1bc10 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
1bc20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1bc30 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
1bc40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1bc50 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
1bc60 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
1bc70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1bc80 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
1bc90 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1bca0 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
1bcb0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69  with database fi
1bcc0 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20  le pDbFd..**.** 
1bcd0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
1bce0 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
1bcf0 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
1bd00 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
1bd10 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
1bd20 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
1bd30 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
1bd40 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
1bd50 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
1bd60 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
1bd70 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1bd80 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
1bd90 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
1bda0 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
1bdb0 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  int winOpenShare
1bdc0 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20  dMemory(winFile 
1bdd0 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
1bde0 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20  t winShm *p;    
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be00 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1be10 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1be20 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
1be30 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1be40 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  0;   /* The unde
1be50 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
1be60 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1be90 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1bea0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1beb0 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
1bec0 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
1bed0 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65  cated winShmNode
1bee0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1bf10 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74   of zName in byt
1bf20 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1bf30 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
1bf40 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
1bf50 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
1bf60 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
1bf70 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
1bf80 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
1bf90 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
1bfa0 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
1bfb0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
1bfc0 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
1bfd0 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
1bfe0 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
1bff0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1c000 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1c010 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1c020 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1c030 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  OMEM;.  nName = 
1c040 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1c050 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1c060 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1c070 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1c080 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1c090 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1c0a0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1c0b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c0c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1c0d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1c0e0 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46  ;.  }.  pNew->zF
1c0f0 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
1c100 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c  )&pNew[1];.  sql
1c110 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e  ite3_snprintf(nN
1c120 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46  ame+15, pNew->zF
1c130 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1c140 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1c150 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53  ;.  sqlite3FileS
1c160 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
1c170 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ath, pNew->zFile
1c180 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  name);..  /* Loo
1c190 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
1c1a0 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
1c1b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
1c1c0 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
1c1d0 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
1c1e0 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
1c1f0 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
1c200 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
1c210 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
1c220 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
1c230 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
1c240 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
1c250 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
1c260 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
1c270 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
1c280 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
1c290 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
1c2a0 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
1c2b0 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
1c2c0 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
1c2d0 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
1c2e0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1c2f0 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
1c300 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
1c310 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
1c320 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1c330 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
1c340 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1c350 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
1c360 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
1c370 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
1c380 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
1c390 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
1c3a0 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
1c3b0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1c3c0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
1c3d0 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
1c3e0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
1c3f0 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
1c400 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
1c410 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
1c420 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1c430 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
1c440 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
1c450 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
1c460 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1c470 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1c480 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1c490 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1c4a0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
1c4b0 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
1c4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c4d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
1c4e0 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
1c4f0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1c500 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
1c510 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1c520 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1c530 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1c540 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
1c550 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1c570 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
1c580 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1c590 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1c5a0 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20  EN_CREATE,.     
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
1c5c0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1c5d0 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67  K!=rc ){.      g
1c5e0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1c5f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c600 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1c610 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1c620 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
1c630 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
1c640 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
1c650 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1c660 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
1c670 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c680 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1c690 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1c6a0 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
1c6b0 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
1c6c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1c6d0 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1c6e0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1c6f0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
1c700 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1c710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c720 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1c730 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1c740 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
1c750 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c770 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53         "winOpenS
1c780 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1c790 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1c7a0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1c7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c7c0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1c7d0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1c7e0 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1c7f0 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  DMS, 1);.      r
1c800 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1c810 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1c820 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_RDLCK, WIN_S
1c830 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1c840 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
1c850 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1c860 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1c870 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
1c880 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
1c890 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  he winShmNode */
1c8a0 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
1c8b0 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65   pShmNode;.#ifde
1c8c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1c8d0 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
1c8e0 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
1c8f0 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
1c900 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
1c910 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
1c920 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1c930 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1c940 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1c950 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1c960 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1c970 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1c980 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1c990 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  he winShmEnterMu
1c9a0 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
1c9b0 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
1c9c0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
1c9d0 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62  truct winShm) ob
1c9e0 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
1c9f0 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
1ca00 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
1ca10 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
1ca20 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
1ca30 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
1ca40 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
1ca50 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
1ca60 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
1ca70 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
1ca80 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
1ca90 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
1caa0 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  utex.  ** mutex.
1cab0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1cac0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1cad0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1cae0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1caf0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1cb00 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1cb10 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1cb20 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1cb30 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1cb40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1cb50 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1cb60 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
1cb70 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
1cb80 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1cb90 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1cba0 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1cbb0 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68  DMS, 1);.  winSh
1cbc0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
1cbd0 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20  fs, 0);      /* 
1cbe0 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
1cbf0 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
1cc00 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
1cc10 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
1cc20 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1cc30 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1cc40 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
1cc50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
1cc60 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
1cc70 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
1cc80 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
1cc90 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72  derlying.** stor
1cca0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
1ccb0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g is true..*/.st
1ccc0 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55  atic int winShmU
1ccd0 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
1cce0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1ccf0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1cd00 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1cd10 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65  mory */.  int de
1cd20 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
1cd30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
1cd40 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20  fter closing if 
1cd50 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  true */.){.  win
1cd60 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
1cd70 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1cd80 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  olding shared-me
1cd90 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1cda0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1cdb0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1cdc0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
1cdd0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1cde0 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
1cdf0 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
1ce00 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
1ce10 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b  /.  winShm **pp;
1ce20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1ce30 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
1ce40 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1ce50 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  s */..  pDbFd = 
1ce60 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
1ce70 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1ce80 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1ce90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cea0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1ceb0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  pShmNode;..  /* 
1cec0 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
1ced0 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
1cee0 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
1cef0 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1cf00 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
1cf10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1cf20 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1cf30 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
1cf40 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
1cf50 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
1cf60 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
1cf70 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
1cf80 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
1cf90 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
1cfa0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
1cfb0 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
1cfc0 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
1cfd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1cfe0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1cff0 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
1d000 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
1d010 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
1d020 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
1d030 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
1d040 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
1d050 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  o */.  winShmEnt
1d060 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
1d070 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
1d080 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
1d090 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
1d0a0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1d0b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53  f==0 ){.    winS
1d0c0 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
1d0d0 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  Vfs, deleteFlag)
1d0e0 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65  ;.  }.  winShmLe
1d0f0 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
1d100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1d120 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
1d130 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
1d140 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
1d150 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1d160 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
1d170 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1d180 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d190 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
1d1a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1d1b0 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d1d0 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
1d1e0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1d1f0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d210 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d220 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
1d230 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1d240 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
1d250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1d260 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1d270 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
1d280 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
1d290 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1d2a0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1d2b0 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
1d2c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed memory */.  w
1d2d0 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
1d2e0 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
1d2f0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1d300 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
1d310 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53  locked */.  winS
1d320 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
1d330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d340 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1d350 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
1d360 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  gs */.  winShmNo
1d370 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
1d380 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
1d390 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d3a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d3b0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1d3c0 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
1d3d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d3f0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
1d400 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
1d410 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1d420 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
1d430 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
1d440 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1d450 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
1d460 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
1d470 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
1d480 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1d490 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1d4a0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1d4b0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1d4c0 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
1d4d0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1d4e0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1d4f0 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1d500 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1d510 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1d520 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
1d530 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
1d540 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
1d550 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
1d560 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1d570 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
1d580 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f   = (u16)((1U<<(o
1d590 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
1d5a0 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
1d5b0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
1d5c0 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
1d5d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1d5e0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1d5f0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
1d600 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
1d610 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
1d620 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
1d630 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
1d640 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
1d650 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
1d660 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
1d670 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
1d680 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1d690 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1d6a0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1d6b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
1d6c0 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
1d6d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
1d6e0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
1d6f0 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
1d700 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
1d710 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
1d720 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1d730 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1d740 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
1d750 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
1d760 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
1d770 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
1d780 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1d790 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1d7a0 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1d7b0 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1d7c0 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
1d7d0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1d7e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
1d7f0 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
1d800 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
1d810 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1d830 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
1d840 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
1d850 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1d860 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1d870 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1d880 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
1d890 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
1d8a0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
1d8b0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
1d8c0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
1d8d0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
1d8e0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
1d8f0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
1d900 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
1d910 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1d920 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
1d930 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
1d940 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
1d950 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1d960 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
1d970 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
1d980 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
1d990 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1d9a0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1d9b0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1d9c0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1d9d0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1d9e0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
1d9f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1da00 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
1da10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1da20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
1da30 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1da40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1da50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
1da60 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1da70 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
1da80 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1da90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1daa0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
1dab0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1dac0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1dad0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1dae0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1daf0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1db00 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
1db10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1db20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1db30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1db40 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
1db50 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
1db60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1db70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1db80 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
1db90 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
1dba0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
1dbb0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
1dbc0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
1dbd0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
1dbe0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
1dbf0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
1dc00 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1dc10 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1dc20 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
1dc30 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1dc40 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1dc50 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1dc60 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1dc70 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1dc80 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
1dc90 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1dca0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1dcb0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1dcc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1dcd0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1dce0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1dcf0 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1dd00 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1dd10 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1dd20 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1dd30 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1dd40 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1dd50 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1dd60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1dd70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1dd80 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1dd90 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1dda0 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
1ddb0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1ddc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1ddd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dde0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
1ddf0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1de00 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
1de10 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
1de20 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
1de30 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1de40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1de50 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1de60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1de70 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
1de80 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
1de90 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
1dea0 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
1deb0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1dec0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1ded0 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
1dee0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1def0 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
1df00 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
1df10 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1df20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1df30 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1df40 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1df50 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1df60 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  ed memory..**.**
1df70 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
1df80 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
1df90 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
1dfa0 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
1dfb0 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
1dfc0 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
1dfd0 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
1dfe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dff0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a   winShmBarrier(.
1e000 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e010 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  fd          /* D
1e020 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1e030 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1e040 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
1e050 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1e060 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69    /* MemoryBarri
1e070 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f  er(); // does no
1e080 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74  t work -- do not
1e090 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f   know why not */
1e0a0 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1e0b0 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c  tex();.  winShmL
1e0c0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
1e0d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e0e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1e0f0 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
1e100 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
1e110 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68  ion of the.** sh
1e120 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
1e130 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1e140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
1e150 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
1e160 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e  regions.** are n
1e170 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1e180 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1e190 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1e1a0 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1e1b0 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  n.** bytes in si
1e1c0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
1e1d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1e1e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1e1f0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
1e200 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1e210 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1e220 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
1e230 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
1e240 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1e250 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
1e260 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
1e270 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1e280 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
1e290 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
1e2a0 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
1e2b0 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
1e2c0 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
1e2d0 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
1e2e0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1e2f0 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69   If.** isWrite i
1e300 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
1e310 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1e320 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1e330 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a  n has not yet.**
1e340 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1e350 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
1e360 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1e370 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1e380 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1e390 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
1e3a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1e3b0 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
1e3c0 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
1e3d0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1e3e0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
1e3f0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1e400 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64  processes.** add
1e410 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1e420 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1e430 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1e440 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1e450 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  pped.** memory a
1e460 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1e470 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1e480 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a   int winShmMap(.
1e490 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1e4a0 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1e4b0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
1e4c0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
1e4d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
1e4e0 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1e4f0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
1e500 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
1e510 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
1e540 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ions */.  int is
1e550 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
1e560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e570 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
1e580 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1e590 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
1e5a0 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
1e5b0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
1e5c0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1e5d0 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
1e5e0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a  = (winFile*)fd;.
1e5f0 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d    winShm *pShm =
1e600 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1e610 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1e620 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Node;.  int rc =
1e630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1e640 66 28 20 21 70 53 68 6d 20 29 7b 0a 20 20 20 20  f( !pShm ){.    
1e650 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72  rc = winOpenShar
1e660 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
1e670 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e680 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1e690 72 63 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20 70  rc;.    pShm = p
1e6a0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a  DbFd->pShm;.  }.
1e6b0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68    pShmNode = pSh
1e6c0 6d 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  m->pShmNode;..  
1e6d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1e6e0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1e6f0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1e700 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
1e710 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
1e720 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e730 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
1e740 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1e750 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
1e760 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
1e770 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20  n *apNew;       
1e780 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69      /* New aRegi
1e790 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
1e7a0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
1e7b0 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
1e7c0 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
1e7d0 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
1e7e0 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
1e7f0 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20  3_int64 sz;     
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e810 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
1e820 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a  wal-index file *
1e830 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
1e840 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
1e850 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
1e860 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1e870 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
1e880 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1e890 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
1e8a0 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
1e8b0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
1e8c0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1e8d0 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
1e8e0 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
1e8f0 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
1e900 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
1e910 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
1e920 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
1e930 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1e940 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1e950 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1e960 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
1e970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e980 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1e990 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1e9a0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1e9b0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1e9c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e9d0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1e9e0 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map1", pDbFd->zP
1e9f0 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ath);.      goto
1ea00 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1ea10 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
1ea20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
1ea30 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1ea40 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
1ea50 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
1ea60 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
1ea70 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
1ea80 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
1ea90 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
1eaa0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1eab0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
1eac0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1ead0 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
1eae0 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
1eaf0 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
1eb00 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
1eb10 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
1eb20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1eb30 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
1eb40 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
1eb50 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
1eb60 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
1eb70 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
1eb80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1eb90 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1eba0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1ebb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ebc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1ebd0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1ebe0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1ebf0 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1ec00 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ec20 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62  winShmMap2", pDb
1ec30 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1ec40 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1ec50 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1ec60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
1ec70 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1ec80 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
1ec90 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1eca0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
1ecb0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73  /.    apNew = (s
1ecc0 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1ecd0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1ece0 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1ecf0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
1ed00 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
1ed10 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
1ed20 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
1ed30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1ed40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1ed50 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1ed60 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1ed70 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
1ed80 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1ed90 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
1eda0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1edb0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
1edc0 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1edd0 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
1ede0 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
1edf0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
1ee00 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
1ee10 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
1ee20 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1ee30 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
1ee40 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d  S_WINRT.      hM
1ee50 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1ee60 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1ee70 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1ee80 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1ee90 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1eea0 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  E, nByte, NULL. 
1eeb0 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1eec0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1eed0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1eee0 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1eef0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1ef00 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1ef10 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1ef20 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1ef30 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1ef40 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1ef50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1ef60 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
1ef70 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1ef80 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1ef90 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1efa0 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1efb0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1efc0 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1efd0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
1efe0 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1eff0 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
1f000 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1f010 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
1f020 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1f030 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f040 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f050 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1f060 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
1f070 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
1f080 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1f090 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
1f0a0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
1f0b0 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
1f0c0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
1f0d0 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
1f0e0 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1f0f0 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1f100 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1f110 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1f120 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1f130 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
1f140 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1f150 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
1f160 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1f170 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1f180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
1f190 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1f1a0 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1f1b0 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1f1c0 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
1f1d0 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
1f1e0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
1f1f0 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
1f200 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
1f210 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
1f220 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
1f230 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1f240 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1f250 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  t.        );.#en
1f260 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52  dif.        OSTR
1f270 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41  ACE(("SHM-MAP-MA
1f280 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1f290 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  n=%d, offset=%d,
1f2a0 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1f2b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f2c0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f2d0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1f2e0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1f2f0 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
1f300 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
1f310 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
1f320 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1f330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f340 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
1f350 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
1f360 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1f370 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1f380 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1f390 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1f3a0 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
1f3b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3d0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1f3e0 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  3", pDbFd->zPath
1f3f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68  );.        if( h
1f400 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e  Map ) osCloseHan
1f410 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20  dle(hMap);.     
1f420 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1f430 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1f440 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1f450 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
1f460 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20  nRegion].pMap = 
1f470 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMap;.      pShm
1f480 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
1f490 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
1f4a0 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  .hMap = hMap;.  
1f4b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
1f4c0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
1f4d0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
1f4e0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1f4f0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
1f500 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
1f510 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a  set = iRegion*sz
1f520 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  Region;.    int 
1f530 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1f540 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1f550 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1f560 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20  Granularity;.   
1f570 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
1f580 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65   *)pShmNode->aRe
1f590 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d  gion[iRegion].pM
1f5a0 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76  ap;.    *pp = (v
1f5b0 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74  oid *)&p[iOffset
1f5c0 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  Shift];.  }else{
1f5d0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
1f5e0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1f5f0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1f600 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1f610 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  rn rc;.}..#else.
1f620 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d  # define winShmM
1f630 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
1f640 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20  e winShmLock    
1f650 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1f660 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
1f670 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20  ine winShmUnmap 
1f680 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
1f690 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f6a0 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
1f6b0 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61  Cleans up the ma
1f6c0 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74  pped region of t
1f6d0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1f6e0 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69  e, if any..*/.#i
1f6f0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1f700 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
1f710 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
1f720 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
1f730 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
1f740 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
1f750 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1f760 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1f770 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52  , hMap=%p, pMapR
1f780 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
1f790 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65         "mmapSize
1f7a0 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41  =%lld, mmapSizeA
1f7b0 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70  ctual=%lld, mmap
1f7c0 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c  SizeMax=%lld\n",
1f7d0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1f7e0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1f7f0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1f800 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e  e->hMap, pFile->
1f810 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20  pMapRegion,.    
1f820 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1f830 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d  apSize, pFile->m
1f840 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70  mapSizeActual, p
1f850 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1f860 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x));.  if( pFile
1f870 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
1f880 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
1f890 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
1f8a0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
1f8b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1f8c0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1f8d0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1f8e0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1f8f0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1f900 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
1f910 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1f920 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
1f930 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1f940 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
1f950 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1f960 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
1f970 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
1f980 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
1f990 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1f9a0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1f9b0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1f9c0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f9e0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20  winUnmapfile1", 
1f9f0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1fa00 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1fa10 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
1fa20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1fa30 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
1fa40 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1fa50 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
1fa60 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
1fa70 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
1fa80 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
1fa90 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
1faa0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1fab0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1fac0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1fad0 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1fae0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1faf0 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1fb00 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1fb10 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
1fb20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1fb30 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1fb40 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
1fb50 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
1fb60 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1fb70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1fb80 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1fb90 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1fbb0 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70  inUnmapfile2", p
1fbc0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1fbd0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68    }.    pFile->h
1fbe0 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Map = NULL;.  }.
1fbf0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1fc00 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1fc10 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1fc20 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1fc30 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1fc40 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1fc50 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
1fc60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1fc70 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
1fc80 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
1fc90 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
1fca0 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
1fcb0 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
1fcc0 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
1fcd0 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
1fce0 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
1fcf0 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
1fd00 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65   Or, if.** there
1fd10 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
1fd20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
1fd30 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
1fd40 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20  re are still.** 
1fd50 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1fd60 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
1fd70 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
1fd80 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1fd90 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1fda0 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
1fdb0 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
1fdc0 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
1fdd0 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ted size of.** t
1fde0 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
1fdf0 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
1fe00 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
1fe10 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
1fe20 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  n the.** request
1fe30 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
1fe40 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1fe50 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
1fe60 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
1fe70 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
1fe80 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
1fe90 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1fea0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
1feb0 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67  figured.** using
1fec0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
1fed0 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76  AP_SIZE, whichev
1fee0 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
1fef0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1ff00 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
1ff10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
1ff20 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
1ff30 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
1ff40 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
1ff50 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
1ff60 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
1ff70 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ff80 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
1ff90 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1ffa0 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
1ffb0 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  File *pFd, sqlit
1ffc0 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
1ffd0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1ffe0 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
1fff0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
20000 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
20010 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
20020 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
20030 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
20040 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65  , pFile=%p, size
20050 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
20060 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20070 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
20080 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69  d, nByte));..  i
20090 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
200a0 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
200b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
200c0 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  Map<0 ){.    rc 
200d0 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
200e0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64  qlite3_file*)pFd
200f0 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66  , &nMap);.    if
20100 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53  ( rc ){.      OS
20110 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
20120 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
20130 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
20140 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20  ERR_FSTAT\n",.  
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
20160 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
20170 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20  Id(), pFd));.   
20180 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20190 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
201a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d    }.  }.  if( nM
201b0 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
201c0 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
201d0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
201e0 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26  ax;.  }.  nMap &
201f0 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ~(sqlite3_int6
20200 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  4)(winSysInfo.dw
20210 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a  PageSize - 1);..
20220 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26    if( nMap==0 &&
20230 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30   pFd->mmapSize>0
20240 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   ){.    winUnmap
20250 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20  file(pFd);.  }. 
20260 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
20270 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
20280 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  void *pNew = 0;.
20290 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63      DWORD protec
202a0 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c  t = PAGE_READONL
202b0 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61  Y;.    DWORD fla
202c0 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45  gs = FILE_MAP_RE
202d0 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61  AD;..    winUnma
202e0 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20  pfile(pFd);.    
202f0 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
20300 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
20310 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
20320 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45    protect = PAGE
20330 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
20340 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f    flags |= FILE_
20350 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  MAP_WRITE;.    }
20360 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
20370 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INRT.    pFd->hM
20380 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
20390 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
203a0 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
203b0 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c  otect, nMap, NUL
203c0 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
203d0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
203e0 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64  AS_WIDE).    pFd
203f0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
20400 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46  eFileMappingW(pF
20410 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
20420 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
20450 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
20460 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20480 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
20490 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
204a0 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ), NULL);.#elif 
204b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
204c0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
204d0 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
204e0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
204f0 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngA(pFd->h, NULL
20500 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
20510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20520 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
20530 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
20540 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
20570 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
20580 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
20590 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
205a0 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29  Fd->hMap==NULL )
205b0 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  {.      pFd->las
205c0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
205d0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
205e0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
205f0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
20600 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72  MAP, pFd->lastEr
20610 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
20620 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
20630 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e  Mapfile1", pFd->
20640 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a  zPath);.      /*
20650 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20   Log the error, 
20660 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72  but continue nor
20670 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73  mal operation us
20680 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
20690 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
206a0 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45  E(("MAP-FILE-CRE
206b0 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
206c0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
206d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
206e0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
206f0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
20700 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
20710 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
20720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20730 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 6e  }.    assert( (n
20740 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  Map % winSysInfo
20750 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  .dwPageSize)==0 
20760 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
20770 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73  izeof(SIZE_T)==s
20780 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e  izeof(sqlite3_in
20790 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78  t64) || nMap<=0x
207a0 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20  ffffffff );.#if 
207b0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
207c0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
207d0 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
207e0 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  p(pFd->hMap, fla
207f0 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e  gs, 0, (SIZE_T)n
20800 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Map);.#else.    
20810 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
20820 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70  OfFile(pFd->hMap
20830 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28  , flags, 0, 0, (
20840 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
20850 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65  ndif.    if( pNe
20860 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  w==NULL ){.     
20870 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
20880 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20  Fd->hMap);.     
20890 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c   pFd->hMap = NUL
208a0 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61  L;.      pFd->la
208b0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
208c0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
208d0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
208e0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
208f0 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
20900 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
20920 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d  nMapfile2", pFd-
20930 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
20940 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
20950 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
20960 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
20970 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
20980 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
20990 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41  CE(("MAP-FILE-MA
209a0 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
209b0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
209d0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
209e0 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
209f0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
20a00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
20a10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
20a20 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
20a30 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ion = pNew;.    
20a40 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
20a50 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  nMap;.    pFd->m
20a60 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
20a70 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  nMap;.  }..  OST
20a80 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
20a90 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
20aa0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
20ab0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
20ac0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20ad0 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
20ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20af0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
20b00 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20b10 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
20b20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
20b30 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20b40 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
20b50 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
20b60 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
20b70 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
20b80 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
20b90 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
20ba0 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
20bb0 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
20bc0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
20bd0 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
20be0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
20bf0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
20c00 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
20c10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
20c20 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
20c30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
20c40 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
20c50 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
20c60 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
20c70 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
20c80 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
20c90 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
20ca0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
20cb0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
20cc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
20cd0 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
20ce0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
20cf0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a  must eventually.
20d00 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
20d10 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
20d20 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29  ing winUnfetch()
20d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20d40 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33  winFetch(sqlite3
20d50 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
20d60 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
20d70 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
20d80 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20d90 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20  IZE>0.  winFile 
20da0 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  *pFd = (winFile*
20db0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
20dc0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
20dd0 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
20de0 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f  .  *pp = 0;..  O
20df0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
20e00 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
20e10 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61  , offset=%lld, a
20e20 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c  mount=%d, pp=%p\
20e30 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
20e40 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20e50 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66  ssId(), fd, iOff
20e60 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23  , nAmt, pp));..#
20e70 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
20e80 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
20e90 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
20ea0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
20eb0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
20ec0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
20ed0 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
20ee0 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
20ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20f00 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  ){.        OSTRA
20f10 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
20f20 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
20f30 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
20f40 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20f50 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20f60 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
20f70 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
20f80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20fa0 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
20fb0 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
20fc0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
20fd0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
20fe0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
20ff0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
21000 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
21010 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
21020 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
21030 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
21040 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63  p=%p, *pp=%p, rc
21050 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
21060 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
21070 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
21080 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29  ), fd, pp, *pp))
21090 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
210a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
210b0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
210c0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
210d0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
210e0 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a  tion releases a.
210f0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
21100 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
21110 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46  ier call to winF
21120 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
21130 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
21140 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
21150 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
21160 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
21170 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
21180 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
21190 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
211a0 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63  winFetch() invoc
211b0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ation..**.** Or,
211c0 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
211d0 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
211e0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
211f0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
21200 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  ed.** to inform 
21210 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
21220 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
21230 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
21240 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  ting mapping.** 
21250 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
21260 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
21270 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
21280 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
21290 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
212a0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
212b0 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
212c0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
212d0 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
212e0 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
212f0 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
21300 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
21310 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
21320 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
21330 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
21340 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
21350 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
21360 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
21370 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
21380 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
21390 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
213a0 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
213b0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
213c0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
213d0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
213e0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
213f0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
21400 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
21410 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
21420 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
21430 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
21440 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
21450 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
21460 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
21470 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
21480 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
21490 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
214a0 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
214b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
214c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
214d0 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
214e0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
214f0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
21500 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
21510 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
21520 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
21530 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
21540 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
21550 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
21560 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
21570 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
21580 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
21590 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
215a0 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
215b0 63 65 73 73 61 72 79 20 63 61 6e 20 62 65 20 6f  cessary can be o
215c0 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69  mitted - potenti
215d0 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20  ally improving. 
215e0 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63     ** performanc
215f0 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e  e.  */.    winUn
21600 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
21610 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
21620 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
21630 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
21640 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
21650 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
21660 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
21670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
21680 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
21690 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65  Id(), fd));.  re
216a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
216b0 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
216c0 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
216d0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
216e0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
216f0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
21700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
21710 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
21720 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
21730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21740 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
21750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21790 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
217a0 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
217b0 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
217c0 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
217d0 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
217e0 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
217f0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
21800 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
21810 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
21820 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20  d = {.  3,      
21830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21840 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
21850 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
21860 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
21870 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
21880 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c  se */.  winRead,
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
218b0 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20   */.  winWrite, 
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218d0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
218e0 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  */.  winTruncate
218f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21900 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
21910 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20  e */.  winSync, 
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
21940 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  */.  winFileSize
21950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21960 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
21970 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20  e */.  winLock, 
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
219a0 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20  */.  winUnlock, 
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
219d0 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73  */.  winCheckRes
219e0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
219f0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
21a00 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
21a10 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  winFileControl, 
21a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a30 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
21a40 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  */.  winSectorSi
21a50 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
21a60 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
21a70 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69  ize */.  winDevi
21a80 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
21a90 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76  s,       /* xDev
21aa0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21ab0 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61  cs */.  winShmMa
21ac0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
21ad0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
21ae0 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  ap */.  winShmLo
21af0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
21b00 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
21b10 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42  ock */.  winShmB
21b20 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
21b30 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
21b40 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
21b50 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
21b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b70 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77  xShmUnmap */.  w
21b80 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  inFetch,        
21b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ba0 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69  * xFetch */.  wi
21bb0 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20  nUnfetch        
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21bd0 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a   xUnfetch */.};.
21be0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
21bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
21c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69  *********** sqli
21c50 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
21c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
21c80 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
21c90 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d   contains the im
21ca0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
21cb0 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a  methods on the.*
21cc0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  * sqlite3_vfs ob
21cd0 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65  ject..*/..#if de
21ce0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
21cf0 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  )./*.** Convert 
21d00 61 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20  a filename from 
21d10 77 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64  whatever the und
21d20 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
21d30 67 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70  g system.** supp
21d40 6f 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d  orts for filenam
21d50 65 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20  es into UTF-8.  
21d60 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
21d70 65 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f  e result is.** o
21d80 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
21d90 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
21da0 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
21db0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
21dc0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
21dd0 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
21de0 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f  ilename(const vo
21df0 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  id *zFilename){.
21e00 20 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74    char *zConvert
21e10 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73  ed = 0;.  if( os
21e20 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  IsNT() ){.    zC
21e30 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e  onverted = winUn
21e40 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c  icodeToUtf8(zFil
21e50 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
21e60 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
21e70 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
21e80 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
21e90 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
21ea0 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 46 69  mbcs_to_utf8(zFi
21eb0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e  lename);.  }.#en
21ec0 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
21ed0 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
21ee0 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
21ef0 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
21f00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
21f10 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
21f20 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
21f30 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
21f40 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
21f50 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
21f60 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
21f70 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
21f80 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
21f90 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
21fa0 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
21fb0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
21fc0 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
21fd0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
21fe0 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65  c void *winConve
21ff0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
22000 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
22010 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69  Filename){.  voi
22020 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
22030 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  0;.  if( osIsNT(
22040 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
22050 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ted = winUtf8ToU
22060 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
22070 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
22080 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
22090 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
220a0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
220b0 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
220c0 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  to_mbcs(zFilenam
220d0 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
220e0 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
220f0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
22100 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
22110 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
22120 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
22130 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
22140 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
22150 69 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69  ified UTF-8 stri
22160 6e 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64  ng buffer.** end
22170 73 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f  s with a directo
22180 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ry separator cha
22190 72 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61  racter or one wa
221a0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a  s successfully.*
221b0 2a 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a  * added to it..*
221c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
221d0 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
221e0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
221f0 7a 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75  zBuf){.  if( zBu
22200 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65  f ){.    int nLe
22210 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
22220 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69  n30(zBuf);.    i
22230 66 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  f( nLen>0 ){.   
22240 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53     if( winIsDirS
22250 65 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29  ep(zBuf[nLen-1])
22260 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
22270 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
22280 65 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75  e if( nLen+1<nBu
22290 66 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75  f ){.        zBu
222a0 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74  f[nLen] = winGet
222b0 44 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20  DirSep();.      
222c0 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d    zBuf[nLen+1] =
222d0 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72   '\0';.        r
222e0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
222f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22300 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22310 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
22320 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  ry file name and
22330 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
22340 74 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74  ting pointer int
22350 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20  o pzBuf..** The 
22360 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
22370 20 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62   in pzBuf must b
22380 65 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69  e freed via sqli
22390 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
223a0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
223b0 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33  Tempname(sqlite3
223c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72  _vfs *pVfs, char
223d0 20 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61   **pzBuf){.  sta
223e0 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b  tic char zChars[
223f0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
22400 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
22410 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
22420 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
22430 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
22440 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74  56789";.  size_t
22450 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72   i, j;.  int nPr
22460 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
22470 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f  n30(SQLITE_TEMP_
22480 46 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20  FILE_PREFIX);.  
22490 69 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20  int nMax, nBuf, 
224a0 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68  nDir, nLen;.  ch
224b0 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20  ar *zBuf;..  /* 
224c0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
224d0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
224e0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
224f0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
22500 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
22510 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
22520 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
22530 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
22540 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
22550 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20  tion failing..  
22560 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
22570 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
22580 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
22590 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65  /* Allocate a te
225a0 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
225b0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  o store the full
225c0 79 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65  y qualified file
225d0 0a 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74  .  ** name for t
225e0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
225f0 65 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c  e.  If this fail
22600 73 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e  s, we cannot con
22610 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  tinue..  */.  nM
22620 61 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  ax = pVfs->mxPat
22630 68 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d  hname; nBuf = nM
22640 61 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d  ax + 2;.  zBuf =
22650 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
22660 72 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66  ro( nBuf );.  if
22670 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f  ( !zBuf ){.    O
22680 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22690 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
226a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
226b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
226c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
226d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
226e0 72 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63  re out the effec
226f0 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64  tive temporary d
22700 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74  irectory.  First
22710 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20  , check if one. 
22720 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70   ** has been exp
22730 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74  licitly set by t
22740 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20  he application; 
22750 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  otherwise, use t
22760 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66  he one.  ** conf
22770 69 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70  igured by the op
22780 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a  erating system..
22790 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d    */.  nDir = nM
227a0 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29  ax - (nPre + 15)
227b0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72  ;.  assert( nDir
227c0 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  >0 );.  if( sqli
227d0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
227e0 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44  ry ){.    int nD
227f0 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53  irLen = sqlite3S
22800 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f  trlen30(sqlite3_
22810 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
22820 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e  .    if( nDirLen
22830 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
22840 21 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c  !winIsDirSep(sql
22850 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
22860 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20  ory[nDirLen-1]) 
22870 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c  ){.        nDirL
22880 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  en++;.      }.  
22890 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
228a0 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nDir ){.        
228b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
228c0 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  f);.        OSTR
228d0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
228e0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
228f0 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ROR\n"));.      
22900 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
22910 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
22920 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d  R, 0, "winGetTem
22930 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20  pname1", 0);.   
22940 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
22950 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
22960 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71  , zBuf, "%s", sq
22970 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
22980 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tory);.    }.  }
22990 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
229a0 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b  YGWIN__).  else{
229b0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
229c0 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
229d0 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f   = {.       0, /
229e0 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  * getenv("SQLITE
229f0 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  _TMPDIR") */.   
22a00 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
22a10 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20  ("TMPDIR") */.  
22a20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
22a30 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20  v("TMP") */.    
22a40 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
22a50 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  "TEMP") */.     
22a60 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
22a70 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f  USERPROFILE") */
22a80 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d  .       "/var/tm
22a90 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72  p",.       "/usr
22aa0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f  /tmp",.       "/
22ab0 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22  tmp",.       "."
22ac0 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20  ,.       0      
22ad0 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e    /* List termin
22ae0 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  ator */.    };. 
22af0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
22b00 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  i;.    const cha
22b10 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20  r *zDir = 0;..  
22b20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
22b30 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
22b40 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
22b50 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
22b60 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
22b70 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
22b80 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69  "TMPDIR");.    i
22b90 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20  f( !azDirs[2] ) 
22ba0 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65  azDirs[2] = gete
22bb0 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69  nv("TMP");.    i
22bc0 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20  f( !azDirs[3] ) 
22bd0 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65  azDirs[3] = gete
22be0 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20  nv("TEMP");.    
22bf0 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29  if( !azDirs[4] )
22c00 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74   azDirs[4] = get
22c10 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45  env("USERPROFILE
22c20 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ");.    for(i=0;
22c30 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73   i<sizeof(azDirs
22c40 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b  )/sizeof(azDirs[
22c50 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73  0]); zDir=azDirs
22c60 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f  [i++]){.      vo
22c70 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
22c80 20 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d        if( zDir==
22c90 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
22ca0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
22cb0 74 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61  th starts with a
22cc0 20 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f   drive letter fo
22cd0 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f  llowed by the co
22ce0 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61  lon.      ** cha
22cf0 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69  racter, assume i
22d00 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e  t is already a n
22d10 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
22d20 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  ; otherwise,.   
22d30 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65     ** it must be
22d40 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20   converted to a 
22d50 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74  native Win32 pat
22d60 68 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e  h via the Cygwin
22d70 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72   API.      ** pr
22d80 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e  ior to using it.
22d90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
22da0 69 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65  if( winIsDriveLe
22db0 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69  tterAndColon(zDi
22dc0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  r) ){.        zC
22dd0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
22de0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
22df0 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20  ename(zDir);.   
22e00 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65       if( !zConve
22e10 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  rted ){.        
22e20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22e30 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Buf);.          
22e40 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22e50 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22e60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
22e70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ));.          re
22e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22e90 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  R_NOMEM;.       
22ea0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77   }.        if( w
22eb0 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
22ec0 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ed) ){.         
22ed0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22ee0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22ef0 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20  s", zDir);.     
22f00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22f10 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
22f20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22f50 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
22f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22f70 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
22f80 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
22f90 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20   nMax+1 );.     
22fa0 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74     if( !zConvert
22fb0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
22fc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22fd0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
22fe0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22ff0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
23000 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
23010 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
23020 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
23030 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
23040 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 79 67  .        if( cyg
23050 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
23070 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f  sIsNT() ? CCP_PO
23080 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43  SIX_TO_WIN_W : C
23090 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
230a0 41 2c 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20  A, zDir,.       
230b0 20 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72           zConver
230c0 74 65 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29  ted, nMax+1)<0 )
230d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
230e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
230f0 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
23100 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
23110 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53  f);.          OS
23120 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
23130 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
23140 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e  IOERR_CONVPATH\n
23150 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  "));.          r
23160 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
23170 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  r(SQLITE_IOERR_C
23180 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
23190 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
231c0 61 6d 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20  ame2", zDir);.  
231d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
231e0 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
231f0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
23200 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
23210 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20   point, we know 
23220 74 68 65 20 63 61 6e 64 69 64 61 74 65 20 64 69  the candidate di
23230 72 65 63 74 6f 72 79 20 65 78 69 73 74 73 20 61  rectory exists a
23240 6e 64 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20  nd should.      
23250 20 20 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20      ** be used. 
23260 20 48 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79   However, we may
23270 20 6e 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74   need to convert
23280 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74   the string cont
23290 61 69 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  aining.         
232a0 20 2a 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74   ** its name int
232b0 6f 20 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66  o UTF-8 (i.e. if
232c0 20 69 74 20 69 73 20 55 54 46 2d 31 36 20 72 69   it is UTF-16 ri
232d0 67 68 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20  ght now)..      
232e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
232f0 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
23300 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
23310 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74  ilename(zConvert
23320 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ed);.          i
23330 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20  f( !zUtf8 ){.   
23340 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23350 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
23360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
23370 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
23380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f  );.            O
23390 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
233a0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
233b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
233c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
233d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
233e0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
233f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23400 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23410 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
23420 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
23430 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23440 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
23450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23460 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
23470 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23490 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
234a0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
234b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c   }.    }.  }.#el
234c0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
234d0 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
234e0 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c  __CYGWIN__).  el
234f0 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  se if( osIsNT() 
23500 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75  ){.    char *zMu
23510 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20  lti;.    LPWSTR 
23520 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69  zWidePath = sqli
23530 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
23540 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  Max*sizeof(WCHAR
23550 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57  ) );.    if( !zW
23560 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20  idePath ){.     
23570 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
23580 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
23590 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
235a0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
235b0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
235c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
235d0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
235e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
235f0 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61  GetTempPathW(nMa
23600 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  x, zWidePath)==0
23610 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23620 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
23630 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23640 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
23650 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
23660 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
23670 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
23680 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
23690 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
236a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
236b0 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
236c0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
236d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
236e0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
236f0 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29  etTempname2", 0)
23700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c  ;.    }.    zMul
23710 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ti = winUnicodeT
23720 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
23730 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
23740 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23750 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
23760 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75   zBuf, "%s", zMu
23770 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
23780 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
23790 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
237a0 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
237b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
237c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
237d0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
237e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
237f0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
23800 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
23810 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
23820 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
23830 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23840 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
23850 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
23860 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
23870 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
23880 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
23890 20 20 20 20 63 68 61 72 20 2a 7a 4d 62 63 73 50      char *zMbcsP
238a0 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
238b0 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b  locZero( nMax );
238c0 0a 20 20 20 20 69 66 28 20 21 7a 4d 62 63 73 50  .    if( !zMbcsP
238d0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
238e0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
238f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
23900 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
23910 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
23920 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
23930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
23940 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
23950 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
23960 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a  empPathA(nMax, z
23970 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a  MbcsPath)==0 ){.
23980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23990 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
239a0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
239b0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
239c0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
239d0 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
239e0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
239f0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
23a00 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47  GETTEMPPATH, osG
23a10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
23a40 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20  empname3", 0);. 
23a50 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d     }.    zUtf8 =
23a60 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
23a70 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63  bcs_to_utf8(zMbc
23a80 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  sPath);.    if( 
23a90 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
23aa0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23ab0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
23ac0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
23ad0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
23ae0 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
23af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23b00 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
23b10 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
23b20 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
23b30 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
23b40 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
23b50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
23b60 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
23b70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
23b80 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a  WIN32_HAS_ANSI *
23b90 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  /.#endif /* !SQL
23ba0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a  ITE_OS_WINRT */.
23bb0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
23bc0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
23bd0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
23be0 63 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20  ctory ends with 
23bf0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20  an appropriate. 
23c00 20 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20   ** separator.  
23c10 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  If it does not a
23c20 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  nd there is not 
23c30 65 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66  enough space lef
23c40 74 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e  t to add.  ** on
23c50 65 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20  e, fail..  */.  
23c60 69 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49  if( !winMakeEndI
23c70 6e 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20  nDirSep(nDir+1, 
23c80 7a 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c  zBuf) ){.    sql
23c90 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
23ca0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
23cb0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23cc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
23cd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
23ce0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
23cf0 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
23d00 65 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29  etTempname4", 0)
23d10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
23d20 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
23d30 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
23d40 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
23d50 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
23d60 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69  file.  ** name i
23d70 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
23d80 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a  format:.  **.  *
23d90 2a 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f  *   "<temporary_
23da0 64 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71  directory>/etilq
23db0 73 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58  s_XXXXXXXXXXXXXX
23dc0 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a  X\0\0".  **.  **
23dd0 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20   If not, return 
23de0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54  SQLITE_ERROR.  T
23df0 68 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20  he number 17 is 
23e00 75 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64  used here in ord
23e10 65 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75  er to.  ** accou
23e20 6e 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65  nt for the space
23e30 20 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20   used by the 15 
23e40 63 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d  character random
23e50 20 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a   suffix and the.
23e60 20 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e    ** two trailin
23e70 67 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73  g NUL characters
23e80 2e 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72  .  The final dir
23e90 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
23ea0 20 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20   character.  ** 
23eb0 68 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65  has already adde
23ec0 64 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  d if it was not 
23ed0 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e  already present.
23ee0 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73  .  */.  nLen = s
23ef0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23f00 42 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65  Buf);.  if( (nLe
23f10 6e 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e  n + nPre + 17) >
23f20 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c   nBuf ){.    sql
23f30 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
23f40 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54  .    OSTRACE(("T
23f50 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23f60 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29  SQLITE_ERROR\n")
23f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
23f80 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
23f90 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47  _ERROR, 0, "winG
23fa0 65 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29  etTempname5", 0)
23fb0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
23fc0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
23fd0 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65  6-nLen, zBuf+nLe
23fe0 6e 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  n, SQLITE_TEMP_F
23ff0 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20  ILE_PREFIX);..  
24000 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
24010 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c  n30(zBuf);.  sql
24020 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
24030 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
24040 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
24050 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  i++, j++){.    z
24060 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
24070 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
24080 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
24090 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
240a0 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  1) ];.  }.  zBuf
240b0 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b  [j] = 0;.  zBuf[
240c0 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42  j+1] = 0;.  *pzB
240d0 75 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53  uf = zBuf;..  OS
240e0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
240f0 45 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ENAME name=%s, r
24100 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
24110 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf));.  return
24120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
24130 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
24140 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69   if the named fi
24150 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64  le is really a d
24160 69 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72  irectory.  Retur
24170 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74  n false if.** it
24180 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74   is something ot
24190 68 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63  her than a direc
241a0 74 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72  tory, or if ther
241b0 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66  e is any kind of
241c0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63   memory.** alloc
241d0 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  ation failure..*
241e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
241f0 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64  IsDir(const void
24200 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20   *zConverted){. 
24210 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
24220 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
24230 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
24240 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
24250 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
24260 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
24270 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
24280 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
24290 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
242a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
242b0 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
242c0 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
242d0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
242e0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
242f0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24310 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
24320 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20  oStandard,.     
24330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24340 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
24350 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79  ta)) && winRetry
24360 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
24370 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20  tErrno) ){}.    
24380 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
24390 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e   return 0; /* In
243a0 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20  valid name? */. 
243b0 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20     }.    attr = 
243c0 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
243d0 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20  Attributes;.#if 
243e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
243f0 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
24400 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
24410 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
24420 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
24430 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
24440 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c  urn (attr!=INVAL
24450 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
24460 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c  ES) && (attr&FIL
24470 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
24480 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  CTORY);.}../*.**
24490 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f   Open a file..*/
244a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
244b0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
244c0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
244d0 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20   /* Used to get 
244e0 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d  maximum path nam
244f0 65 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f  e length */.  co
24500 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
24510 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
24520 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
24530 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
24540 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
24550 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
24560 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64  SQLite file hand
24570 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
24580 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
24590 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d         /* Open m
245a0 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  ode flags */.  i
245b0 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
245c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
245d0 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20  us return flags 
245e0 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  */.){.  HANDLE h
245f0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
24600 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44  rno = 0;.  DWORD
24610 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24620 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
24630 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
24640 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
24650 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
24660 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24670 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
24680 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
24690 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
246a0 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
246b0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
246c0 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
246d0 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
246e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
246f0 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e  me in OS encodin
24700 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
24710 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a  r *zUtf8Name = z
24720 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  Name; /* Filenam
24730 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  e in UTF-8 encod
24740 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ing */.  int cnt
24750 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
24760 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
24770 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
24780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24790 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
247a0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
247b0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
247c0 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
247d0 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
247e0 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
247f0 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20   *zTmpname = 0; 
24800 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  /* For temporary
24810 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65   filename, if ne
24820 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69  cessary. */..  i
24830 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24840 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
24850 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
24860 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65   Code */.#if !de
24870 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
24880 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
24890 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
248a0 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
248b0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
248c0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
248d0 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63  dif..  int isExc
248e0 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73  lusive  = (flags
248f0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45   & SQLITE_OPEN_E
24900 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74  XCLUSIVE);.  int
24910 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20   isDelete     = 
24920 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24930 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
24940 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65  SE);.  int isCre
24950 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ate     = (flags
24960 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   & SQLITE_OPEN_C
24970 52 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73  REATE);.  int is
24980 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
24990 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
249a0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69  N_READONLY);.  i
249b0 6e 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20  nt isReadWrite  
249c0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
249d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
249e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
249f0 55 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a  UG.  int isOpenJ
24a00 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61  ournal = (isCrea
24a10 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20  te && (.        
24a20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24a30 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
24a40 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  L.     || eType=
24a50 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
24a60 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c  N_JOURNAL.     |
24a70 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24a80 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23  OPEN_WAL.  ));.#
24a90 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
24aa0 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
24ab0 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73   pFile=%p, flags
24ac0 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  =%x, pOutFlags=%
24ad0 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
24ae0 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20   zUtf8Name, id, 
24af0 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  flags, pOutFlags
24b00 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ));..  /* Check 
24b10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
24b20 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
24b30 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  e:.  **.  **   (
24b40 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
24b50 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
24b60 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
24b70 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
24b80 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  and.  **   (b) i
24b90 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
24ba0 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
24bb0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
24bc0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
24bd0 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
24be0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
24bf0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
24c00 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
24c10 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
24c20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
24c30 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
24c40 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
24c50 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
24c60 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
24c70 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
24c80 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
24c90 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
24ca0 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
24cb0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
24cc0 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
24cd0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
24ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
24cf0 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
24d00 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
24d10 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
24d20 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
24d30 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
24d40 61 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a  al are never.  *
24d50 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
24d60 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
24d70 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
24d80 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
24d90 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24da0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24db0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24dc0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
24dd0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24de0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24df0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24e00 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
24e10 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
24e20 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
24e30 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
24e40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
24e50 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
24e60 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
24e70 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
24e80 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
24e90 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
24ea0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
24eb0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
24ec0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
24ed0 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
24ee0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
24ef0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24f00 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
24f10 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24f20 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20 20  EN_TEMP_DB.     
24f30 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
24f40 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
24f50 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
24f60 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
24f70 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c  JOURNAL.       |
24f80 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
24f90 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
24fa0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
24fb0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
24fc0 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c  OURNAL.       ||
24fd0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24fe0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
24ff0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
25000 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
25010 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
25020 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  !=0 );.  memset(
25030 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
25040 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46  (winFile));.  pF
25050 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  ile->h = INVALID
25060 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a  _HANDLE_VALUE;..
25070 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
25080 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38  NRT.  if( !zUtf8
25090 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33  Name && !sqlite3
250a0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
250b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
250c0 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  og(SQLITE_ERROR,
250d0 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65  .        "sqlite
250e0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
250f0 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
25100 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52   be set for WinR
25110 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T");.  }.#endif.
25120 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
25130 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
25140 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25150 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
25160 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79  a.  ** temporary
25170 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73   file name to us
25180 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55  e.  */.  if( !zU
25190 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61  tf8Name ){.    a
251a0 73 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20  ssert( isDelete 
251b0 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
251c0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  l );.    rc = wi
251d0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66  nGetTempname(pVf
251e0 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  s, &zTmpname);. 
251f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  E_OK ){.      OS
25210 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
25220 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55  e=%s, rc=%s", zU
25230 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  tf8Name, sqlite3
25240 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
25250 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25260 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e      }.    zUtf8N
25270 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a  ame = zTmpname;.
25280 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61    }..  /* Databa
25290 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  se filenames are
252a0 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72   double-zero ter
252b0 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20  minated if they 
252c0 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49  are not.  ** URI
252d0 73 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  s with parameter
252e0 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20  s.  Hence, they 
252f0 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61  can always be pa
25300 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
25310 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
25320 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  eter()..  */.  a
25330 73 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53  ssert( (eType!=S
25340 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
25350 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  DB) || (flags & 
25360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
25370 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38   ||.       zUtf8
25380 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  Name[sqlite3Strl
25390 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b  en30(zUtf8Name)+
253a0 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  1]==0 );..  /* C
253b0 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e  onvert the filen
253c0 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65  ame to the syste
253d0 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  m encoding. */. 
253e0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
253f0 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
25400 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
25410 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
25420 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
25430 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
25440 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52  pname);.    OSTR
25450 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
25460 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
25470 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66  ERR_NOMEM", zUtf
25480 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
25490 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
254a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69  _NOMEM;.  }..  i
254b0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
254c0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73  verted) ){.    s
254d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
254e0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
254f0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
25500 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
25510 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
25520 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f   rc=SQLITE_CANTO
25530 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66  PEN_ISDIR", zUtf
25540 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  8Name));.    ret
25550 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
25560 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a  PEN_ISDIR;.  }..
25570 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
25580 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72  e ){.    dwDesir
25590 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
255a0 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
255b0 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65  C_WRITE;.  }else
255c0 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
255d0 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
255e0 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  READ;.  }..  /* 
255f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
25600 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f  USIVE is used to
25610 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
25620 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20 20  a new file is.  
25630 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
25640 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
25650 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
25660 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
25670 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75  .  ** as it is u
25680 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f  sually understoo
25690 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
256a0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
256b0 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65   /* Creates a ne
256c0 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  w file, only if 
256d0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
256e0 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20  ady exist. */.  
256f0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
25700 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c   exists, it fail
25710 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
25720 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
25730 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20  = CREATE_NEW;.  
25740 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61  }else if( isCrea
25750 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  te ){.    /* Ope
25760 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c  n existing file,
25770 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74   or create if it
25780 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
25790 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
257a0 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
257b0 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c  EN_ALWAYS;.  }el
257c0 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73  se{.    /* Opens
257d0 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66   a file, only if
257e0 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20   it exists. */. 
257f0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
25800 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
25810 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20  EXISTING;.  }.. 
25820 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
25830 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
25840 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
25850 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65  E;..  if( isDele
25860 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  te ){.#if SQLITE
25870 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
25880 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
25890 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
258a0 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
258b0 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
258c0 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
258d0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
258e0 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
258f0 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
25900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25910 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
25920 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
25950 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
25960 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
25970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
25980 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
25990 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
259a0 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
259b0 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
259c0 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
259d0 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
259e0 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
259f0 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
25a00 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
25a10 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
25a20 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
25a30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25a40 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
25a50 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
25a60 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
25a70 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  CESS;.#endif..  
25a80 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
25a90 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
25aa0 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49  NRT.    CREATEFI
25ab0 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
25ac0 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64  AMETERS extended
25ad0 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20  Parameters;.    
25ae0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
25af0 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65  rs.dwSize = size
25b00 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45  of(CREATEFILE2_E
25b10 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
25b20 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  RS);.    extende
25b30 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
25b40 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20  leAttributes =. 
25b50 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
25b60 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
25b70 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
25b80 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
25b90 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
25ba0 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c  FileFlags = dwFl
25bb0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
25bc0 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53   & FILE_FLAG_MAS
25bd0 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
25be0 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75  arameters.dwSecu
25bf0 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53  rityQosFlags = S
25c00 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55  ECURITY_ANONYMOU
25c10 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  S;.    extendedP
25c20 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75  arameters.lpSecu
25c30 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d  rityAttributes =
25c40 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e   NULL;.    exten
25c50 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54  dedParameters.hT
25c60 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55  emplateFile = NU
25c70 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  LL;.    while( (
25c80 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
25c90 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  2((LPCWSTR)zConv
25ca0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
25cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cc0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
25cd0 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cf0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
25d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
25d20 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
25d30 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72      &extendedPar
25d60 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c  ameters))==INVAL
25d70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
25d80 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
25db0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
25dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25dd0 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
25de0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68    }.#else.    wh
25df0 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
25e00 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
25e10 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
25e40 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
25e70 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, NULL,.   
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e90 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
25ea0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
25eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ed0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
25ee0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
25ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f00 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
25f10 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
25f20 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
25f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f40 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
25f50 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
25f60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
25f70 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
25f80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
25f90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
25fa0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
25fb0 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
25fc0 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
25fd0 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76  eA((LPCSTR)zConv
25fe0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
25ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26000 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
26010 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26030 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
26040 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
26050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26060 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
26070 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
26080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26090 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
260a0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
260b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
260d0 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
260e0 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26100 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
26110 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
26120 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26140 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20   Noop */.    }. 
26150 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c   }.#endif.  winL
26160 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c  ogIoerr(cnt, __L
26170 49 4e 45 5f 5f 29 3b 0a 0a 20 20 4f 53 54 52 41  INE__);..  OSTRA
26180 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
26190 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
261a0 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22  ss=%lx, rc=%s\n"
261b0 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a  , h, zUtf8Name,.
261c0 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
261d0 69 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d  iredAccess, (h==
261e0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
261f0 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
26200 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66   : "ok"));..  if
26210 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
26220 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
26230 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
26240 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
26250 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
26260 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
26270 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
26280 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74  , "winOpen", zUt
26290 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  f8Name);.    sql
262a0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
262b0 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
262c0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
262d0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  );.    if( isRea
262e0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
262f0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
26300 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70  return winOpen(p
26310 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a  Vfs, zName, id,.
26320 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
26330 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
26340 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20  DONLY) &.       
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28                ~(
26360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
26370 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
26380 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20  EADWRITE)),.    
26390 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b       pOutFlags);
263a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
263b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
263c0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
263d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
263e0 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
263f0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
26400 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
26410 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
26420 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
26430 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
26440 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
26450 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
26460 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f  ;.    }.  }..  O
26470 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69  STRACE(("OPEN fi
26480 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20  le=%p, name=%s, 
26490 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74  access=%lx, pOut
264a0 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46  Flags=%p, *pOutF
264b0 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20  lags=%d, ".     
264c0 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c        "rc=%s\n",
264d0 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64   h, zUtf8Name, d
264e0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
264f0 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46  pOutFlags, pOutF
26500 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20  lags ?.         
26510 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30    *pOutFlags : 0
26520 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
26530 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
26540 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
26550 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
26560 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65  WINCE.  if( isRe
26570 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
26580 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
26590 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20  IN_DB.       && 
265a0 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74  (rc = winceCreat
265b0 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
265c0 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  le))!=SQLITE_OK.
265d0 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65    ){.    osClose
265e0 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
265f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
26600 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
26610 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
26620 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
26630 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20  (("OPEN-CE-LOCK 
26640 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
26650 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  ", zName, sqlite
26660 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
26670 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26680 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
26690 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44  ){.    pFile->zD
266a0 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  eleteOnClose = z
266b0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c  Converted;.  }el
266c0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
266d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
266e0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
266f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26700 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69  zTmpname);.  pFi
26710 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77  le->pMethod = &w
26720 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46  inIoMethod;.  pF
26730 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
26740 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
26750 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
26760 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ly ){.    pFile-
26770 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
26780 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  NFILE_RDONLY;.  
26790 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
267a0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d  uri_boolean(zNam
267b0 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54  e, "psow", SQLIT
267c0 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
267d0 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46  WRITE) ){.    pF
267e0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
267f0 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a  = WINFILE_PSOW;.
26800 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73    }.  pFile->las
26810 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
26820 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  R;.  pFile->zPat
26830 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53  h = zName;.#if S
26840 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
26850 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68  IZE>0.  pFile->h
26860 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46  Map = NULL;.  pF
26870 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
26880 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
26890 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46  apSize = 0;.  pF
268a0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
268b0 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ual = 0;.  pFile
268c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
268d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
268e0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
268f0 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  if..  OpenCounte
26900 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
26910 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
26920 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
26930 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
26940 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
26950 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
26960 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
26970 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
26980 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
26990 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
269a0 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
269b0 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
269c0 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
269d0 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
269e0 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
269f0 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
26a00 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
26a10 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
26a20 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
26a30 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
26a40 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
26a50 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
26a60 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
26a70 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
26a80 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
26a90 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
26aa0 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
26ab0 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
26ac0 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
26ad0 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
26ae0 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
26af0 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
26b00 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
26b10 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
26b20 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
26b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
26b40 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
26b50 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
26b60 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
26b70 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
26b80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
26b90 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
26ba0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
26bb0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
26bc0 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
26bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
26be0 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
26bf0 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
26c00 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
26c10 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f  WORD attr;.  DWO
26c20 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
26c30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
26c40 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
26c50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
26c60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
26c70 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20  ER(syncDir);..  
26c80 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
26c90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26ca0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f  ERR_DELETE);.  O
26cb0 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
26cc0 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72  name=%s, syncDir
26cd0 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%d\n", zFilenam
26ce0 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20  e, syncDir));.. 
26cf0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
26d00 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
26d10 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
26d20 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
26d30 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
26d40 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
26d50 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
26d60 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
26d70 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  n", zFilename));
26d80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26d90 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
26da0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
26db0 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23  () ){.    do {.#
26dc0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
26dd0 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46  RT.      WIN32_F
26de0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
26df0 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
26e00 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
26e10 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
26e20 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
26e30 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46 69      if ( osGetFi
26e40 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
26e50 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46  zConverted, GetF
26e60 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
26e70 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
26ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
26eb0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
26ec0 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
26ed0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26ee0 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
26ef0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
26f00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
26f10 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
26f20 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
26f30 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
26f40 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
26f50 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
26f60 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26f70 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
26f80 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
26f90 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
26fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26fb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26fc0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
26fd0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
26fe0 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
26ff0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
27000 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
27010 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
27020 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 20 61  dif.      if ( a
27030 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr==INVALID_FIL
27040 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a  E_ATTRIBUTES ){.
27050 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
27060 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
27070 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
27080 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
27090 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
270a0 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
270b0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
270c0 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
270d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
270e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
270f0 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
27100 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
27110 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27120 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27130 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
27140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
27150 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
27160 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45    if ( attr&FILE
27170 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
27180 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  TORY ){.        
27190 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
271a0 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79  R; /* Files only
271b0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
271c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
271d0 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46    if ( osDeleteF
271e0 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileW(zConverted)
271f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27200 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44   SQLITE_OK; /* D
27210 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20  eleted OK. */.  
27220 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27230 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
27240 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26  !winRetryIoerr(&
27250 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
27260 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27270 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
27280 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65  * No more retrie
27290 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  s. */.        br
272a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
272b0 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d   } while(1);.  }
272c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
272d0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
272e0 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
272f0 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
27300 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
27310 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
27320 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
27330 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
27340 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
27350 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
27360 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
27370 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
27380 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
27390 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
273a0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
273b0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
273c0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
273d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
273e0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
273f0 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
27400 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
27410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27420 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
27430 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
27440 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27450 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
27460 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
27470 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
27480 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
27490 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
274a0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
274b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
274c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
274d0 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a   osDeleteFileA(z
274e0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
274f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27500 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
27510 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
27520 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27530 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
27540 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
27550 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
27560 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27570 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
27580 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
27590 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
275a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
275b0 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  le(1);.  }.#endi
275c0 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63  f.  if( rc && rc
275d0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  !=SQLITE_IOERR_D
275e0 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20  ELETE_NOENT ){. 
275f0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
27600 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
27610 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72  _DELETE, lastErr
27620 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65 22 2c  no, "winDelete",
27630 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d   zFilename);.  }
27640 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67  else{.    winLog
27650 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e  Ioerr(cnt, __LIN
27660 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E__);.  }.  sqli
27670 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
27680 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
27690 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
276a0 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c  , rc=%s\n", zFil
276b0 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  ename, sqlite3Er
276c0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
276d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
276e0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
276f0 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stence and statu
27700 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
27710 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
27720 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
27730 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
27740 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
27750 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
27760 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
27770 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
27780 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
27790 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277b0 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
277c0 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
277d0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
277e0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
277f0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
27800 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
27810 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
27820 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
27830 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
27840 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
27850 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27860 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53  ETER(pVfs);..  S
27870 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
27880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
27890 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
278a0 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
278b0 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73  S name=%s, flags
278c0 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c  =%x, pResOut=%p\
278d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
278e0 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c  Filename, flags,
278f0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a   pResOut));..  z
27900 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
27910 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
27920 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
27930 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
27940 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
27950 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
27960 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
27970 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
27980 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
27990 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
279a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
279b0 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
279c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
279d0 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
279e0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
279f0 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
27a00 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
27a10 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
27a20 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
27a30 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
27a40 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
27a50 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
27a60 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
27a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a80 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
27a90 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
27ac0 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65  rData)) && winRe
27ad0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
27ae0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
27af0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
27b00 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
27b10 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
27b20 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
27b30 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
27b40 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
27b50 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
27b60 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
27b70 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
27b80 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
27b90 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
27ba0 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
27bb0 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20  leSizeHigh==0.  
27bc0 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
27bd0 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
27be0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
27bf0 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
27c00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
27c10 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27c20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
27c30 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
27c40 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
27c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27c60 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
27c70 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
27c80 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
27c90 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  !=ERROR_FILE_NOT
27ca0 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72  _FOUND && lastEr
27cb0 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno!=ERROR_PATH_
27cc0 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
27cd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27ce0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
27cf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
27d00 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
27d10 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c  _IOERR_ACCESS, l
27d20 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63  astErrno, "winAc
27d30 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20  cess",.         
27d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d50 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20    zFilename);.  
27d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d70 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
27d80 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
27d90 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  S;.      }.    }
27da0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
27db0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
27dc0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74  I.  else{.    at
27dd0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
27de0 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
27df0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
27e00 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
27e10 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
27e20 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ed);.  switch( f
27e30 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
27e40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
27e50 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51  EAD:.    case SQ
27e60 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
27e70 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TS:.      rc = a
27e80 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
27e90 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
27ea0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
27eb0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
27ec0 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
27ed0 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
27ee0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
27ef0 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20  BUTES &&.       
27f00 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49        (attr & FI
27f10 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41  LE_ATTRIBUTE_REA
27f20 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20  DONLY)==0;.     
27f30 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
27f40 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
27f50 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
27f60 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
27f70 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
27f80 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  c;.  OSTRACE(("A
27f90 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70  CCESS name=%s, p
27fa0 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
27fb0 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
27fc0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
27fd0 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70      zFilename, p
27fe0 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74  ResOut, *pResOut
27ff0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
28000 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28010 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
28020 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
28030 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  ed path name sta
28040 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65  rts with a drive
28050 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f   letter.** follo
28060 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63  wed by a colon c
28070 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61  haracter..*/.sta
28080 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72  tic BOOL winIsDr
28090 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
280a0 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
280b0 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
280c0 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33  return ( sqlite3
280d0 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d  Isalpha(zPathnam
280e0 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61  e[0]) && zPathna
280f0 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a  me[1]==':' );.}.
28100 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
28110 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
28120 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
28130 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  me should be use
28140 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a  d verbatim.  If.
28150 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  ** non-zero is r
28160 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69  eturned from thi
28170 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20  s function, the 
28180 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
28190 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20   must simply.** 
281a0 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64  use the provided
281b0 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61   path name verba
281c0 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65  tim -OR- resolve
281d0 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20   it into a full 
281e0 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69  path name.** usi
281f0 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61  ng the GetFullPa
28200 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49  thName Win32 API
28210 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76   function (if av
28220 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  ailable)..*/.sta
28230 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65  tic BOOL winIsVe
28240 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a  rbatimPathname(.
28250 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
28260 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a  athname.){.  /*.
28270 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
28280 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
28290 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73  h a forward slas
282a0 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68  h or a backslash
282b0 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20  , it is either. 
282c0 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20   ** a legal UNC 
282d0 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72  name, a volume r
282e0 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72  elative path, or
282f0 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
28300 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20  h name in the.  
28310 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74  ** "Unix" format
28320 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68   on Windows.  Th
28330 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77  ere is no easy w
28340 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69  ay to differenti
28350 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a  ate between.  **
28360 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63   the final two c
28370 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ases; therefore,
28380 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73   we return the s
28390 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  afer return valu
283a0 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73  e of TRUE.  ** s
283b0 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f  o that callers o
283c0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
283d0 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20  will simply use 
283e0 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a  it verbatim..  *
283f0 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 69  /.  if ( winIsDi
28400 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30  rSep(zPathname[0
28410 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
28420 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
28430 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
28440 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
28450 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20  th a letter and 
28460 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69  a colon it is ei
28470 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20  ther a volume.  
28480 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  ** relative path
28490 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
284a0 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f  path.  Callers o
284b0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
284c0 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74  must not.  ** at
284d0 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69  tempt to treat i
284e0 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20  t as a relative 
284f0 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20  path name (i.e. 
28500 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70  they should simp
28510 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76  ly use.  ** it v
28520 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20  erbatim)..  */. 
28530 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76 65   if ( winIsDrive
28540 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
28550 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20  Pathname) ){.   
28560 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
28570 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
28580 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  we get to this p
28590 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e  oint, the path n
285a0 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73  ame should almos
285b0 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61  t certainly be a
285c0 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c   purely.  ** rel
285d0 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20  ative one (i.e. 
285e0 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20  not a UNC name, 
285f0 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e  not absolute, an
28600 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c  d not volume rel
28610 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72  ative)..  */.  r
28620 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a  eturn FALSE;.}..
28630 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
28640 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
28650 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
28660 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ame.  Write the 
28670 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65  full.** pathname
28680 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a   into zOut[].  z
28690 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74  Out[] will be at
286a0 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50   least pVfs->mxP
286b0 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73  athname.** bytes
286c0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
286d0 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50  tic int winFullP
286e0 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
286f0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
28700 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
28710 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63  ter to vfs objec
28720 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
28730 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20  r *zRelative,   
28740 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
28750 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20   relative input 
28760 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  path */.  int nF
28770 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
28780 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
28790 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  of output buffer
287a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
287b0 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20  har *zFull      
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
287d0 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  Output buffer */
287e0 0a 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .){..#if defined
287f0 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
28800 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
28810 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
28820 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
28830 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
28840 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c  ;.  assert( nFul
28850 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l>=pVfs->mxPathn
28860 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ame );.  if ( sq
28870 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
28880 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
28890 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
288a0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
288b0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
288c0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
288d0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
288e0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
288f0 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
28900 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
28910 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
28920 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
28930 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
28940 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
28950 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
28960 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
28970 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
28980 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
28990 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
289a0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
289b0 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20  and a slash..   
289c0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   */.    char *zO
289d0 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ut = sqlite3Mall
289e0 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78  ocZero( pVfs->mx
289f0 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20  Pathname+1 );.  
28a00 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20    if( !zOut ){. 
28a10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28a20 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
28a30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79      }.    if( cy
28a40 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
28a50 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49              (osI
28a60 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49  sNT() ? CCP_POSI
28a70 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50  X_TO_WIN_W : CCP
28a80 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29  _POSIX_TO_WIN_A)
28a90 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43   |.            C
28aa0 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65  CP_RELATIVE, zRe
28ab0 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56  lative, zOut, pV
28ac0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
28ad0 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )<0 ){.      sql
28ae0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
28af0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
28b00 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
28b10 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
28b20 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
28b30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28b40 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
28b50 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
28b60 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
28b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
28b80 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
28b90 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
28ba0 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  me(zOut);.      
28bb0 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
28bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28bd0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
28be0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28bf0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
28c00 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
28c10 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
28c20 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
28c30 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
28c40 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
28c70 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
28c80 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38 29  DirSep(), zUtf8)
28c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28ca0 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
28cb0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28cc0 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zOut);.    }.  }
28cd0 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
28ce0 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  zOut = sqlite3Ma
28cf0 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e  llocZero( pVfs->
28d00 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a  mxPathname+1 );.
28d10 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b      if( !zOut ){
28d20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28d30 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
28d50 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
28d60 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f  (.            (o
28d70 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f  sIsNT() ? CCP_PO
28d80 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43  SIX_TO_WIN_W : C
28d90 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
28da0 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  A),.            
28db0 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
28dc0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28dd0 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  e+1)<0 ){.      
28de0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
28df0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
28e00 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
28e10 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
28e20 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
28e30 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
28e50 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
28e60 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28e70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
28e80 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e  har *zUtf8 = win
28e90 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
28ea0 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20  ename(zOut);.   
28eb0 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
28ec0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28ed0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
28ee0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
28ef0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
28f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
28f10 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
28f20 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
28f30 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
28f40 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  ll, "%s", zUtf8)
28f50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28f60 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
28f70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28f80 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zOut);.    }.  }
28f90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28fa0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
28fb0 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   (SQLITE_OS_WINC
28fc0 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
28fd0 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65  INRT) && !define
28fe0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
28ff0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
29000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29010 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e  RROR );.  /* Win
29020 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
29030 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
29040 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
29050 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
29060 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20  /* WinRT has no 
29070 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  way to convert a
29080 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74   relative path t
29090 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e  o an absolute on
290a0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c  e. */.  if ( sql
290b0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
290c0 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
290d0 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
290e0 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
290f0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
29100 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
29110 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
29120 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
29130 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
29140 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
29150 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
29160 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
29170 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
29180 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
29190 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
291a0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
291b0 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
291c0 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
291d0 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
291e0 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
291f0 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
29200 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
29210 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
29220 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
29230 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
29240 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
29270 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
29280 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rSep(), zRelativ
29290 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
292a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
292b0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
292c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
292d0 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
292e0 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72  lative);.  }.  r
292f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29300 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
29310 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
29320 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
29330 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
29340 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52  CYGWIN__).  DWOR
29350 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20  D nByte;.  void 
29360 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63  *zConverted;.  c
29370 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a  har *zOut;..  /*
29380 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61   If this path na
29390 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
293a0 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20  /X:", where "X" 
293b0 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69  is any alphabeti
293c0 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  c.  ** character
293d0 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e  , discard the in
293e0 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74  itial "/" from t
293f0 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a  he pathname..  *
29400 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76  /.  if( zRelativ
29410 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e  e[0]=='/' && win
29420 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
29430 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b  Colon(zRelative+
29440 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74  1) ){.    zRelat
29450 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ive++;.  }..  /*
29460 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
29470 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
29480 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
29490 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
294a0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
294b0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
294c0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
294d0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
294e0 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
294f0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
29500 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
29510 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
29520 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
29530 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
29540 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
29550 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
29560 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
29570 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
29580 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
29590 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
295a0 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
295b0 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
295c0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
295d0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
295e0 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
295f0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
29600 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
29610 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
29620 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
29630 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
29640 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
29650 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
29660 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
29670 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
29680 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
29690 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
296a0 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
296b0 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
296c0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
296d0 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63  ectory and a bac
296e0 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20  kslash..    */. 
296f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29700 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
29710 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
29720 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73  , zFull, "%s%c%s
29730 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29740 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29750 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
29760 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
29770 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
29780 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29790 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74  ;.  }.  zConvert
297a0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
297b0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
297c0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
297d0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
297e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
297f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
29800 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
29810 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53  NT() ){.    LPWS
29820 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  TR zTemp;.    nB
29830 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
29840 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
29850 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  R)zConverted, 0,
29860 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
29870 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
29880 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29890 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
298a0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
298b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
298c0 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
298d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
298e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
298f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
29900 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
29910 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
29920 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
29930 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
29940 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
29950 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
29960 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
29970 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
29980 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29990 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
299a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
299b0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
299c0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
299d0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
299e0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
299f0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
29a00 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  Temp, 0);.    if
29a10 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
29a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29a30 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
29a40 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29a50 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72  (zTemp);.      r
29a60 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
29a70 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
29a80 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
29a90 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
29aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ab0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
29ac0 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
29ad0 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
29ae0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
29af0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
29b00 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  Out = winUnicode
29b10 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  ToUtf8(zTemp);. 
29b20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29b30 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64  zTemp);.  }.#ifd
29b40 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
29b50 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
29b60 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
29b70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
29b80 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
29b90 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
29ba0 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ed, 0, 0, 0);.  
29bb0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
29bc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29bd0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29be0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
29bf0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
29c00 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
29c10 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
29c20 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
29c50 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  3", zRelative);.
29c60 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
29c70 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20  += 3;.    zTemp 
29c80 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
29c90 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
29ca0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
29cb0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
29cc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29cd0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29ce0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
29d00 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  EM;.    }.    nB
29d10 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
29d20 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
29d30 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
29d40 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
29d50 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
29d60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29d70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29d90 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
29da0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
29db0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
29dc0 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
29dd0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
29de0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29df0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
29e00 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20 7a  ullPathname4", z
29e10 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
29e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
29e30 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
29e40 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
29e50 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
29e60 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
29e70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
29e80 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  emp);.  }.#endif
29e90 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
29ea0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29eb0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
29ec0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
29ed0 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
29ee0 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
29ef0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
29f00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29f10 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
29f20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29f30 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
29f40 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65  #endif.}..#ifnde
29f50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
29f60 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
29f70 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
29f80 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
29f90 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
29fa0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
29fb0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
29fc0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
29fd0 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
29fe0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
29ff0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
2a000 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
2a010 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
2a020 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2a030 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
2a040 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
2a050 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46  GWIN__).  int nF
2a060 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ull = pVfs->mxPa
2a070 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72  thname+1;.  char
2a080 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65   *zFull = sqlite
2a090 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75  3MallocZero( nFu
2a0a0 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  ll );.  void *zC
2a0b0 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
2a0c0 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a  if( zFull==0 ){.
2a0d0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c      OSTRACE(("DL
2a0e0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
2a0f0 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
2a100 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29  ename, (void*)0)
2a110 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
2a120 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 46 75  .  }.  if( winFu
2a130 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2a140 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
2a150 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54  l, zFull)!=SQLIT
2a160 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
2a170 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b  te3_free(zFull);
2a180 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
2a190 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
2a1a0 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
2a1b0 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
2a1c0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
2a1d0 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74  ;.  }.  zConvert
2a1e0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
2a1f0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
2a200 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zFull);.  sqlite
2a210 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23  3_free(zFull);.#
2a220 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  else.  void *zCo
2a230 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
2a240 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
2a250 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
2a260 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a270 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e 64 69  TER(pVfs);.#endi
2a280 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  f.  if( zConvert
2a290 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
2a2a0 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2a2b0 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2a2c0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2a2d0 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
2a2e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2a2f0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
2a300 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2a310 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  NRT.    h = osLo
2a320 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
2a330 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  y((LPCWSTR)zConv
2a340 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65  erted, 0);.#else
2a350 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
2a360 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52  ibraryW((LPCWSTR
2a370 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
2a380 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
2a390 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2a3a0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
2a3b0 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
2a3c0 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  aryA((char*)zCon
2a3d0 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
2a3e0 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
2a3f0 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
2a400 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
2a410 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
2a420 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  h));.  sqlite3_f
2a430 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
2a440 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
2a450 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
2a460 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
2a470 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a480 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
2a490 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
2a4a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2a4b0 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74  s);.  winGetLast
2a4c0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
2a4d0 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
2a4e0 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
2a4f0 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c  tic void (*winDl
2a500 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
2a510 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63  *pVfs,void *pH,c
2a520 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29  onst char *zSym)
2a530 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 50 52  )(void){.  FARPR
2a540 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45  OC proc;.  UNUSE
2a550 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2a560 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47 65  );.  proc = osGe
2a570 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
2a580 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b  ANDLE)pH, zSym);
2a590 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 53  .  OSTRACE(("DLS
2a5a0 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79  YM handle=%p, sy
2a5b0 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73 73  mbol=%s, address
2a5c0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
2a5d0 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53     (void*)pH, zS
2a5e0 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63 29  ym, (void*)proc)
2a5f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
2a600 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f 63 3b  d(*)(void))proc;
2a610 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
2a620 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  inDlClose(sqlite
2a630 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
2a640 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
2a650 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a660 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c  pVfs);.  osFreeL
2a670 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70  ibrary((HANDLE)p
2a680 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41  Handle);.  OSTRA
2a690 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e  CE(("DLCLOSE han
2a6a0 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64  dle=%p\n", (void
2a6b0 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23  *)pHandle));.}.#
2a6c0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
2a6d0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2a6e0 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
2a6f0 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77  : */.  #define w
2a700 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  inDlOpen  0.  #d
2a710 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72  efine winDlError
2a720 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
2a730 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
2a740 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30  ine winDlClose 0
2a750 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2a760 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66  Write up to nBuf
2a770 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
2a780 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a  ness into zBuf..
2a790 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2a7a0 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  nRandomness(sqli
2a7b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2a7c0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2a7d0 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  Buf){.  int n = 
2a7e0 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
2a7f0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66  METER(pVfs);.#if
2a800 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2a810 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66  TEST).  n = nBuf
2a820 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
2a830 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65   0, nBuf);.#else
2a840 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59  .  if( sizeof(SY
2a850 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d  STEMTIME)<=nBuf-
2a860 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54  n ){.    SYSTEMT
2a870 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74  IME x;.    osGet
2a880 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a  SystemTime(&x);.
2a890 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
2a8a0 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  [n], &x, sizeof(
2a8b0 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  x));.    n += si
2a8c0 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69  zeof(x);.  }.  i
2a8d0 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
2a8e0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
2a8f0 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65  DWORD pid = osGe
2a900 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
2a910 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d();.    memcpy(
2a920 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20  &zBuf[n], &pid, 
2a930 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
2a940 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69    n += sizeof(pi
2a950 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  d);.  }.#if SQLI
2a960 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
2a970 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f  ( sizeof(ULONGLO
2a980 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  NG)<=nBuf-n ){. 
2a990 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74     ULONGLONG cnt
2a9a0 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
2a9b0 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  t64();.    memcp
2a9c0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
2a9d0 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
2a9e0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
2a9f0 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  cnt);.  }.#else.
2aa00 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
2aa10 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
2aa20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f     DWORD cnt = o
2aa30 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b  sGetTickCount();
2aa40 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
2aa50 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
2aa60 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
2aa70 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
2aa80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
2aa90 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
2aaa0 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
2aab0 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
2aac0 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
2aad0 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
2aae0 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65  nter(&i);.    me
2aaf0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
2ab00 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20  i, sizeof(i));. 
2ab10 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69     n += sizeof(i
2ab20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
2ab30 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
2ab40 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
2ab50 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
2ab60 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a  _WIN32_USE_UUID.
2ab70 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 55 49    if( sizeof(UUI
2ab80 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  D)<=nBuf-n ){.  
2ab90 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d    UUID id;.    m
2aba0 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69  emset(&id, 0, si
2abb0 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20  zeof(UUID));.   
2abc0 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26 69   osUuidCreate(&i
2abd0 64 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  d);.    memcpy(z
2abe0 42 75 66 2c 20 26 69 64 2c 20 73 69 7a 65 6f 66  Buf, &id, sizeof
2abf0 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6e 20 2b  (UUID));.    n +
2ac00 3d 20 73 69 7a 65 6f 66 28 55 55 49 44 29 3b 0a  = sizeof(UUID);.
2ac10 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66    }.  if( sizeof
2ac20 28 55 55 49 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  (UUID)<=nBuf-n )
2ac30 7b 0a 20 20 20 20 55 55 49 44 20 69 64 3b 0a 20  {.    UUID id;. 
2ac40 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c 20 30     memset(&id, 0
2ac50 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2ac60 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65 61 74  .    osUuidCreat
2ac70 65 53 65 71 75 65 6e 74 69 61 6c 28 26 69 64 29  eSequential(&id)
2ac80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75  ;.    memcpy(zBu
2ac90 66 2c 20 26 69 64 2c 20 73 69 7a 65 6f 66 28 55  f, &id, sizeof(U
2aca0 55 49 44 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  UID));.    n += 
2acb0 73 69 7a 65 6f 66 28 55 55 49 44 29 3b 0a 20 20  sizeof(UUID);.  
2acc0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2acd0 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
2ace0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
2acf0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
2ad00 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
2ad10 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
2ad20 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
2ad30 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
2ad40 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
2ad50 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69  c){.  sqlite3_wi
2ad60 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f  n32_sleep((micro
2ad70 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  sec+999)/1000);.
2ad80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ad90 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
2ada0 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  rn ((microsec+99
2adb0 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d  9)/1000)*1000;.}
2adc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2add0 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
2ade0 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
2adf0 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
2ae00 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
2ae10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2ae20 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
2ae30 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
2ae40 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
2ae50 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
2ae60 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
2ae70 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
2ae80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2ae90 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
2aea0 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
2aeb0 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
2aec0 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
2aed0 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
2aee0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
2aef0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2af00 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2af10 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2af20 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
2af30 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
2af40 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2af50 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2af60 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
2af70 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
2af80 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
2af90 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
2afa0 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
2afb0 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
2afc0 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
2afd0 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
2afe0 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
2aff0 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
2b000 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
2b010 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
2b020 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
2b030 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
2b040 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
2b050 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
2b060 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2b070 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
2b080 64 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74  d date.** cannot
2b090 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
2b0a0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72  atic int winCurr
2b0b0 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c  entTimeInt64(sql
2b0c0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2b0d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
2b0e0 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45  iNow){.  /* FILE
2b0f0 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
2b100 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
2b110 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
2b120 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
2b130 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20   100-nanosecond 
2b140 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20  intervals since 
2b150 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20  January 1, 1601 
2b160 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29  (= JD 2305813.5)
2b170 2e 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d  ..  */.  FILETIM
2b180 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
2b190 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2b1a0 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
2b1b0 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
2b1c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
2b1d0 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
2b1e0 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
2b1f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2b200 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
2b210 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
2b220 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
2b230 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
2b240 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
2b250 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
2b260 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
2b270 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2b280 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
2b290 78 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20  x32BitValue =.  
2b2a0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
2b2b0 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20  64)2000000000 + 
2b2c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2b2d0 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20  000000000 +.    
2b2e0 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
2b2f0 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66  )294967296;..#if
2b300 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2b310 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69  .  SYSTEMTIME ti
2b320 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65  me;.  osGetSyste
2b330 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20  mTime(&time);.  
2b340 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65  /* if SystemTime
2b350 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69  ToFileTime() fai
2b360 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a  ls, it returns z
2b370 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f  ero. */.  if (!o
2b380 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  sSystemTimeToFil
2b390 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29  eTime(&time,&ft)
2b3a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b3b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2b3c0 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
2b3d0 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
2b3e0 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66  e( &ft );.#endif
2b3f0 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e  ..  *piNow = win
2b400 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a  FiletimeEpoch +.
2b410 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28              ((((
2b420 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74  sqlite3_int64)ft
2b430 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
2b440 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20  *max32BitValue) 
2b450 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +.              
2b460 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2b470 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
2b480 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
2b490 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
2b4a0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
2b4b0 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
2b4c0 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
2b4d0 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
2b4e0 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
2b4f0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2b500 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
2b510 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
2b520 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2b530 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2b540 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
2b550 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
2b560 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
2b570 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
2b580 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
2b590 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
2b5a0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
2b5b0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
2b5c0 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
2b5d0 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
2b5e0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
2b5f0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
2b600 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2b610 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
2b620 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
2b630 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
2b640 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
2b650 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2b660 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
2b670 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
2b680 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
2b690 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
2b6a0 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
2b6b0 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
2b6c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b6d0 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
2b6e0 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
2b6f0 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
2b700 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
2b710 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
2b720 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
2b730 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28  e() on Windows (
2b740 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
2b750 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
2b760 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  Unix). After an 
2b770 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
2b780 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
2b790 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
2b7a0 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
2b7b0 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
2b7c0 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
2b7d0 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
2b7e0 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
2b7f0 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
2b800 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
2b810 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
2b820 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
2b830 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
2b840 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
2b850 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
2b860 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
2b870 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
2b880 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
2b890 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
2b8a0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
2b8b0 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
2b8c0 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
2b8d0 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
2b8e0 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
2b8f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
2b900 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
2b910 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
2b920 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
2b930 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
2b940 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
2b950 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
2b960 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
2b970 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
2b980 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
2b990 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
2b9a0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
2b9b0 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
2b9c0 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
2b9d0 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
2b9e0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
2b9f0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
2ba00 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
2ba10 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
2ba20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
2ba30 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
2ba40 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
2ba50 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
2ba60 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
2ba70 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
2ba80 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
2ba90 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
2baa0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2bab0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2bac0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2bad0 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
2bae0 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
2baf0 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
2bb00 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
2bb10 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
2bb20 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
2bb30 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
2bb40 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
2bb50 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
2bb60 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2bb70 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
2bb80 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
2bb90 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2bba0 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
2bbb0 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
2bbc0 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
2bbd0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
2bbe0 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2bbf0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2bc00 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2bc10 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
2bc20 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2bc30 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c    return winGetL
2bc40 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65  astErrorMsg(osGe
2bc50 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42  tLastError(), nB
2bc60 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a  uf, zBuf);.}../*
2bc70 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2bc80 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
2bc90 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2bca0 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
2bcb0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
2bcc0 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
2bcd0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
2bce0 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
2bcf0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2bd00 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2bd10 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2bd20 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
2bd30 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2bd40 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
2bd50 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2bd60 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2bd70 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2bd80 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2bd90 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
2bda0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2bdb0 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
2bde0 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
2bdf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2be00 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2be10 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2be20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
2be30 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
2be40 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2be50 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2be60 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2be70 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2be80 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2be90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2bea0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2beb0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2bec0 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2bed0 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2bee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2bef0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2bf00 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2bf10 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
2bf20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
2bf30 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
2bf40 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
2bf50 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
2bf60 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
2bf70 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2bf80 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
2bf90 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2bfa0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2bfb0 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2bfc0 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2bfd0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2bfe0 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
2bff0 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2c000 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2c010 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2c020 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2c030 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2c040 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2c050 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2c060 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
2c070 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
2c080 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65  l */.  };.#if de
2c090 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2c0a0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
2c0b0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
2c0c0 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73  s winLongPathVfs
2c0d0 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c0f0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
2c100 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
2c110 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
2c120 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  e */.    SQLITE_
2c130 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
2c140 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e  YTES, /* mxPathn
2c150 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c170 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
2c180 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22  "win32-longpath"
2c190 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f  ,    /* zName */
2c1a0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2c1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
2c1c0 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
2c1d0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2c1e0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2c1f0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2c200 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2c210 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2c220 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
2c230 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
2c240 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
2c250 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
2c260 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
2c270 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
2c280 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
2c290 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
2c2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2c2b0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
2c2c0 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2c2d0 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
2c2e0 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
2c2f0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
2c300 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
2c310 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
2c320 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2c330 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2c340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2c350 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2c360 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2c370 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
2c380 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
2c390 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
2c3a0 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
2c3b0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2c3c0 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72  meInt64, /* xCur
2c3d0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
2c3e0 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
2c3f0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
2c400 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2c410 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
2c420 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
2c430 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2c440 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
2c450 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
2c460 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
2c470 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
2c480 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20  uble-check that 
2c490 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61  the aSyscall[] a
2c4a0 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f  rray has been co
2c4b0 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63  nstructed.  ** c
2c4c0 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74  orrectly.  See t
2c4d0 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39  icket [bb3a86e89
2c4e0 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61  0c8e96ab] */.  a
2c4f0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
2c500 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 39 20 29  (aSyscall)==79 )
2c510 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  ;..  /* get memo
2c520 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
2c530 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
2c540 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
2c550 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
2c560 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
2c570 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2c580 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76  NRT.  osGetNativ
2c590 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  eSystemInfo(&win
2c5a0 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  SysInfo);.#else.
2c5b0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66    osGetSystemInf
2c5c0 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
2c5d0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
2c5e0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
2c5f0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
2c600 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ity>0 );.  asser
2c610 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
2c620 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20  PageSize>0 );.. 
2c630 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
2c640 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31  ister(&winVfs, 1
2c650 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
2c660 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2c670 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33  _WIDE).  sqlite3
2c680 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
2c690 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30  inLongPathVfs, 0
2c6a0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
2c6b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c6c0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
2c6d0 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20  _end(void){.#if 
2c6e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2c6f0 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d    if( sleepObj!=
2c700 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c  NULL ){.    osCl
2c710 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f  oseHandle(sleepO
2c720 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62  bj);.    sleepOb
2c730 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65  j = NULL;.  }.#e
2c740 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
2c750 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
2c760 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
2c770 57 49 4e 20 2a 2f 0a                             WIN */.