/ Hex Artifact Content
Login

Artifact b8c28abae3ddb3c52800a461bda257dfedf5c6ae:


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 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f  /*.** Are most o
03e0: 66 20 74 68 65 20 57 69 6e 33 32 20 41 4e 53 49  f the Win32 ANSI
03f0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
0400: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
0410: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
0430: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0440: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
0450: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
0460: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
0470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
0480: 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23 20 20 64 65  2_NO_ANSI).#  de
0490: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
04a0: 32 5f 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69  2_HAS_ANSI.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73  f../*.** Are mos
04c0: 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20 55  t of the Win32 U
04d0: 6e 69 63 6f 64 65 20 41 50 49 73 20 61 76 61 69  nicode APIs avai
04e0: 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68  lable (i.e. with
04f0: 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74 69   certain excepti
0500: 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ons.** based on 
0510: 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  the sub-platform
0520: 29 3f 0a 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  )?.*/.#if (SQLIT
0530: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
0540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c 7c  LITE_OS_WINNT ||
0550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
0560: 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
0570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0580: 5f 4e 4f 5f 57 49 44 45 29 0a 23 20 20 64 65 66  _NO_WIDE).#  def
0590: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
05a0: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
05c0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  e at least one s
05d0: 65 74 20 6f 66 20 57 69 6e 33 32 20 41 50 49 73  et of Win32 APIs
05e0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
05f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
0600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0610: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
0620: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
0630: 41 53 5f 57 49 44 45 29 0a 23 20 20 65 72 72 6f  AS_WIDE).#  erro
0640: 72 20 22 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  r "At least one 
0650: 6f 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  of SQLITE_WIN32_
0660: 48 41 53 5f 41 4e 53 49 20 61 6e 64 20 53 51 4c  HAS_ANSI and SQL
0670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0680: 44 45 5c 0a 20 6d 75 73 74 20 62 65 20 64 65 66  DE\. must be def
0690: 69 6e 65 64 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f  ined.".#endif../
06a0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20  *.** Define the 
06b0: 72 65 71 75 69 72 65 64 20 57 69 6e 64 6f 77 73  required Windows
06c0: 20 53 44 4b 20 76 65 72 73 69 6f 6e 20 63 6f 6e   SDK version con
06d0: 73 74 61 6e 74 73 20 69 66 20 74 68 65 79 20 61  stants if they a
06e0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  re not.** alread
06f0: 79 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  y available..*/.
0700: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0710: 4e 38 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44  N8.#  define NTD
0720: 44 49 5f 57 49 4e 38 20 20 20 20 20 20 20 20 20  DI_WIN8         
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0740: 78 30 36 30 32 30 30 30 30 0a 23 65 6e 64 69 66  x06020000.#endif
0750: 0a 0a 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f  ..#ifndef NTDDI_
0760: 57 49 4e 42 4c 55 45 0a 23 20 20 64 65 66 69 6e  WINBLUE.#  defin
0770: 65 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 20  e NTDDI_WINBLUE 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 20 30 78 30 36 30 33 30 30 30 30 0a 23      0x06030000.#
07a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
07b0: 63 6b 20 69 66 20 74 68 65 20 47 65 74 56 65 72  ck if the GetVer
07c0: 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74  sionEx[AW] funct
07d0: 69 6f 6e 73 20 73 68 6f 75 6c 64 20 62 65 20 63  ions should be c
07e0: 6f 6e 73 69 64 65 72 65 64 20 64 65 70 72 65 63  onsidered deprec
07f0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 76 6f 69  ated.** and avoi
0800: 64 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  d using them in 
0810: 74 68 61 74 20 63 61 73 65 2e 20 20 49 74 20 73  that case.  It s
0820: 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 68  hould be noted h
0830: 65 72 65 20 74 68 61 74 20 69 66 20 74 68 65 0a  ere that if the.
0840: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
0850: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0860: 56 45 52 53 49 4f 4e 45 58 20 70 72 65 2d 70 72  VERSIONEX pre-pr
0870: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 69 73  ocessor macro is
0880: 20 7a 65 72 6f 0a 2a 2a 20 28 77 68 65 74 68 65   zero.** (whethe
0890: 72 20 76 69 61 20 74 68 69 73 20 62 6c 6f 63 6b  r via this block
08a0: 20 6f 72 20 76 69 61 20 62 65 69 6e 67 20 6d 61   or via being ma
08b0: 6e 75 61 6c 6c 79 20 73 70 65 63 69 66 69 65 64  nually specified
08c0: 29 2c 20 74 68 61 74 20 69 6d 70 6c 69 65 73 0a  ), that implies.
08d0: 2a 2a 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ** the underlyin
08e0: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
08f0: 65 6d 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  em will always b
0900: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 57  e based on the W
0910: 69 6e 64 6f 77 73 20 4e 54 0a 2a 2a 20 4b 65 72  indows NT.** Ker
0920: 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  nel..*/.#ifndef 
0930: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0940: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0950: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0960: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0970: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0980: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
0990: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09a0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09b0: 20 30 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20   0.#  else.#    
09c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
09d0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
09e0: 20 20 20 31 0a 23 20 20 65 6e 64 69 66 0a 23 65     1.#  endif.#e
09f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0a00: 20 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64   constant should
0a10: 20 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69   already be defi
0a20: 6e 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e  ned (in the "Win
0a30: 44 65 66 2e 68 22 20 53 44 4b 20 66 69 6c 65 29  Def.h" SDK file)
0a40: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  ..*/.#ifndef MAX
0a50: 5f 50 41 54 48 0a 23 20 20 64 65 66 69 6e 65 20  _PATH.#  define 
0a60: 4d 41 58 5f 50 41 54 48 20 20 20 20 20 20 20 20  MAX_PATH        
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 32                (2
0a80: 36 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  60).#endif../*.*
0a90: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0aa0: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
0ab0: 61 72 73 29 20 66 6f 72 20 57 69 6e 33 32 2e 20  ars) for Win32. 
0ac0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
0ad0: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f  mally be.** MAX_
0ae0: 50 41 54 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  PATH..*/.#ifndef
0af0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0b00: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0b10: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0b20: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
0b30: 52 53 20 20 20 28 4d 41 58 5f 50 41 54 48 29 0a  RS   (MAX_PATH).
0b40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0b50: 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75  is constant shou
0b60: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 64 65  ld already be de
0b70: 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20 22 57  fined (in the "W
0b80: 69 6e 4e 54 2e 68 22 20 53 44 4b 20 66 69 6c 65  inNT.h" SDK file
0b90: 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e  )..*/.#ifndef UN
0ba0: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0bb0: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0bc0: 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f   UNICODE_STRING_
0bd0: 4d 41 58 5f 43 48 41 52 53 20 20 20 20 20 20 28  MAX_CHARS      (
0be0: 33 32 37 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f  32767).#endif../
0bf0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0c00: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0c10: 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e   chars) for WinN
0c20: 54 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  T.  This should 
0c30: 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55  normally be.** U
0c40: 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41  NICODE_STRING_MA
0c50: 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e  X_CHARS..*/.#ifn
0c60: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  def SQLITE_WINNT
0c70: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 0a  _MAX_PATH_CHARS.
0c80: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0c90: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0ca0: 43 48 41 52 53 20 20 20 28 55 4e 49 43 4f 44 45  CHARS   (UNICODE
0cb0: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0cc0: 53 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  S).#endif../*.**
0cd0: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0ce0: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0cf0: 65 73 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20  es) for Win32.  
0d00: 54 68 65 20 4d 41 58 5f 50 41 54 48 20 6d 61 63  The MAX_PATH mac
0d10: 72 6f 20 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72  ro is in.** char
0d20: 61 63 74 65 72 73 2c 20 73 6f 20 77 65 20 61 6c  acters, so we al
0d30: 6c 6f 63 61 74 65 20 34 20 62 79 74 65 73 20 70  locate 4 bytes p
0d40: 65 72 20 63 68 61 72 61 63 74 65 72 20 61 73 73  er character ass
0d50: 75 6d 69 6e 67 20 77 6f 72 73 74 2d 63 61 73 65  uming worst-case
0d60: 20 6f 66 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70   of.** 4-bytes-p
0d70: 65 72 2d 63 68 61 72 61 63 74 65 72 20 66 6f 72  er-character for
0d80: 20 55 54 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65   UTF8..*/.#ifnde
0d90: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
0da0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20  AX_PATH_BYTES.# 
0db0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0dc0: 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
0dd0: 54 45 53 20 20 20 28 53 51 4c 49 54 45 5f 57 49  TES   (SQLITE_WI
0de0: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
0df0: 52 53 2a 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RS*4).#endif../*
0e00: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68  .** Maximum path
0e10: 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20  name length (in 
0e20: 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 4e 54  bytes) for WinNT
0e30: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
0e40: 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e  ormally be.** UN
0e50: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0e60: 5f 43 48 41 52 53 20 2a 20 73 69 7a 65 6f 66 28  _CHARS * sizeof(
0e70: 57 43 48 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64  WCHAR)..*/.#ifnd
0e80: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ef SQLITE_WINNT_
0e90: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 0a 23  MAX_PATH_BYTES.#
0ea0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0eb0: 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
0ec0: 59 54 45 53 20 20 20 5c 0a 20 20 20 20 20 20 20  YTES   \.       
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 28 73 69 7a 65 6f 66 28 57 43 48       (sizeof(WCH
0ef0: 41 52 29 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e  AR) * SQLITE_WIN
0f00: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  NT_MAX_PATH_CHAR
0f10: 53 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  S).#endif../*.**
0f20: 20 4d 61 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d   Maximum error m
0f30: 65 73 73 61 67 65 20 6c 65 6e 67 74 68 20 28 69  essage length (i
0f40: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0f50: 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  RT..*/.#ifndef S
0f60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0f70: 45 52 52 4d 53 47 5f 43 48 41 52 53 0a 23 20 20  ERRMSG_CHARS.#  
0f80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0f90: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
0fa0: 48 41 52 53 20 28 31 30 32 34 29 0a 23 65 6e 64  HARS (1024).#end
0fb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
0fc0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
0fd0: 65 20 63 68 61 72 61 63 74 65 72 20 73 68 6f 75  e character shou
0fe0: 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ld be treated as
0ff0: 20 61 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20   a directory.** 
1000: 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69  separator..*/.#i
1010: 66 6e 64 65 66 20 77 69 6e 49 73 44 69 72 53 65  fndef winIsDirSe
1020: 70 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 49  p.#  define winI
1030: 73 44 69 72 53 65 70 28 61 29 20 20 20 20 20 20  sDirSep(a)      
1040: 20 20 20 20 20 20 20 20 20 20 28 28 28 61 29 20            (((a) 
1050: 3d 3d 20 27 2f 27 29 20 7c 7c 20 28 28 61 29 20  == '/') || ((a) 
1060: 3d 3d 20 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66  == '\\')).#endif
1070: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1080: 72 6f 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ro is used when 
1090: 61 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  a local variable
10a0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 76 61 6c   is set to a val
10b0: 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73  ue that is.** [s
10c0: 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73  ometimes] not us
10d0: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 28  ed by the code (
10e0: 65 2e 67 2e 20 76 69 61 20 63 6f 6e 64 69 74 69  e.g. via conditi
10f0: 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  onal compilation
1100: 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e  )..*/.#ifndef UN
1110: 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1120: 4c 55 45 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  LUE.#  define UN
1130: 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1140: 4c 55 45 28 78 29 20 28 76 6f 69 64 29 28 78 29  LUE(x) (void)(x)
1150: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1160: 65 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61  eturns the chara
1170: 63 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  cter that should
1180: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
1190: 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
11a0: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
11b0: 77 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20  winGetDirSep.#  
11c0: 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72  define winGetDir
11d0: 53 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20  Sep()           
11e0: 20 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66       '\\'.#endif
11f0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65  ../*.** Do we ne
1200: 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64  ed to manually d
1210: 65 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20  efine the Win32 
1220: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
1230: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57  s for use with W
1240: 41 4c 0a 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e  AL.** mode (e.g.
1250: 20 74 68 65 73 65 20 41 50 49 73 20 61 72 65 20   these APIs are 
1260: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
1270: 20 57 69 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b   Windows CE SDK;
1280: 20 68 6f 77 65 76 65 72 2c 20 74 68 65 79 0a 2a   however, they.*
1290: 2a 20 61 72 65 20 6e 6f 74 20 70 72 65 73 65 6e  * are not presen
12a0: 74 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  t in the header 
12b0: 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51  file)?.*/.#if SQ
12c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d  LITE_WIN32_FILEM
12d0: 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64  APPING_API && !d
12e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12f0: 49 54 5f 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77  IT_WAL)./*.** Tw
1300: 6f 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61  o of the file ma
1310: 70 70 69 6e 67 20 41 50 49 73 20 61 72 65 20 64  pping APIs are d
1320: 69 66 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57  ifferent under W
1330: 69 6e 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75  inRT.  Figure ou
1340: 74 20 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77  t which.** set w
1350: 65 20 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53  e need..*/.#if S
1360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57  QLITE_OS_WINRT.W
1370: 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45  INBASEAPI HANDLE
1380: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
1390: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
13a0: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
13b0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
13c0: 54 52 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c  TRIBUTES, ULONG,
13d0: 20 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54   ULONG64, LPCWST
13e0: 52 29 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20  R);..WINBASEAPI 
13f0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
1400: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
1410: 70 70 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47  pp(HANDLE, ULONG
1420: 2c 20 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f  , ULONG64, SIZE_
1430: 54 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65  T);.#else.#if de
1440: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1450: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e  32_HAS_ANSI).WIN
1460: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
1470: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
1480: 4d 61 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c  MappingA(HANDLE,
1490: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
14a0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
14b0: 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20    DWORD, DWORD, 
14c0: 44 57 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a  DWORD, LPCSTR);.
14d0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
14e0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
14f0: 41 53 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66  AS_ANSI) */..#if
1500: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1510: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1520: 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c  WINBASEAPI HANDL
1530: 45 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46  E WINAPI CreateF
1540: 69 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44  ileMappingW(HAND
1550: 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41  LE, LPSECURITY_A
1560: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
1570: 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52       DWORD, DWOR
1580: 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54  D, DWORD, LPCWST
1590: 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  R);.#endif /* de
15a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
15b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a  32_HAS_WIDE) */.
15c0: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
15d0: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
15e0: 77 4f 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20  wOfFile(HANDLE, 
15f0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
1600: 4f 52 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65  ORD, SIZE_T);.#e
1610: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1620: 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINRT */../*.*
1630: 2a 20 54 68 69 73 20 66 69 6c 65 20 6d 61 70 70  * This file mapp
1640: 69 6e 67 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f  ing API is commo
1650: 6e 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20  n to both Win32 
1660: 61 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49  and WinRT..*/.WI
1670: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
1680: 4e 41 50 49 20 55 6e 6d 61 70 56 69 65 77 4f 66  NAPI UnmapViewOf
1690: 46 69 6c 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23  File(LPCVOID);.#
16a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16b0: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
16c0: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
16d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
16e0: 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  L) */../*.** Som
16f0: 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
1700: 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
1710: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
1720: 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46  ifndef INVALID_F
1730: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23  ILE_ATTRIBUTES.#
1740: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
1750: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
1760: 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e  ((DWORD)-1) .#en
1770: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c  dif..#ifndef FIL
1780: 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65  E_FLAG_MASK.# de
1790: 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  fine FILE_FLAG_M
17a0: 41 53 4b 20 20 20 20 20 20 20 20 20 20 28 30 78  ASK          (0x
17b0: 46 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66  FF3C0000).#endif
17c0: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41  ..#ifndef FILE_A
17d0: 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20  TTRIBUTE_MASK.# 
17e0: 64 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52  define FILE_ATTR
17f0: 49 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28  IBUTE_MASK     (
1800: 30 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64  0x0003FFF7).#end
1810: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1820: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46  TE_OMIT_WAL./* F
1830: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1840: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 73 20  s to structures 
1850: 75 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a  used for WAL */.
1860: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1870: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
1880: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
1890: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
18a0: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
18b0: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
18c0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
18d0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
18e0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
18f0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1900: 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61  * WinCE lacks na
1910: 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72  tive support for
1920: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f   file locking so
1930: 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65   we have to fake
1940: 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65   it.** with some
1950: 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e   code of our own
1960: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1970: 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66  OS_WINCE.typedef
1980: 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63   struct winceLoc
1990: 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65  k {.  int nReade
19a0: 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  rs;       /* Num
19b0: 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f  ber of reader lo
19c0: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  cks obtained */.
19d0: 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b    BOOL bPending;
19e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74        /* Indicat
19f0: 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  es a pending loc
1a00: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
1a10: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  ned */.  BOOL bR
1a20: 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20  eserved;     /* 
1a30: 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65  Indicates a rese
1a40: 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65  rved lock has be
1a50: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
1a60: 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65   BOOL bExclusive
1a70: 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65  ;    /* Indicate
1a80: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1a90: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
1aa0: 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65  ained */.} wince
1ab0: 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  Lock;.#endif../*
1ac0: 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20  .** The winFile 
1ad0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73  structure is a s
1ae0: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
1af0: 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69  e3_file* specifi
1b00: 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a  c to the win32.*
1b10: 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61  * portability la
1b20: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
1b30: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77  struct winFile w
1b40: 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77  inFile;.struct w
1b50: 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74  inFile {.  const
1b60: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b70: 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a  ods *pMethod; /*
1b80: 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  ** Must be first
1b90: 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   ***/.  sqlite3_
1ba0: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1bb0: 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20  /* The VFS used 
1bc0: 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  to open this fil
1bd0: 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  e */.  HANDLE h;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf0: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
1c00: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
1c10: 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65  */.  u8 locktype
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c30: 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72  Type of lock cur
1c40: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74  rently held on t
1c50: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68  his file */.  sh
1c60: 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ort sharedLockBy
1c70: 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c  te;   /* Randoml
1c80: 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73  y chosen byte us
1c90: 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c  ed as a shared l
1ca0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c  ock */.  u8 ctrl
1cb0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1cc0: 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20   /* Flags.  See 
1cd0: 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20  WINFILE_* below 
1ce0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
1cf0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  rrno;        /* 
1d00: 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
1d10: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1d20: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66  I/O error */.#if
1d30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d40: 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70  _WAL.  winShm *p
1d50: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
1d60: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
1d70: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
1d80: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  his file */.#end
1d90: 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  if.  const char 
1da0: 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20  *zPath;      /* 
1db0: 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  Full pathname of
1dc0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1dd0: 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20  int szChunk;    
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b          /* Chunk
1df0: 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64   size configured
1e00: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1e10: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1e20: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50  TE_OS_WINCE.  LP
1e30: 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c  WSTR zDeleteOnCl
1e40: 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ose;  /* Name of
1e50: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
1e60: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
1e70: 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b    HANDLE hMutex;
1e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74            /* Mut
1e90: 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  ex used to contr
1ea0: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61  ol access to sha
1eb0: 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20  red lock */  .  
1ec0: 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20  HANDLE hShared; 
1ed0: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1ee0: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1ef0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1f00: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b  g */.  winceLock
1f10: 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f   local;        /
1f20: 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  * Locks obtained
1f30: 20 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63   by this instanc
1f40: 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a  e of winFile */.
1f50: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61    winceLock *sha
1f60: 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f  red;      /* Glo
1f70: 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  bal shared lock 
1f80: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66  memory for the f
1f90: 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  ile  */.#endif.#
1fa0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1fb0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1fc0: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1fe0: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
1ff0: 6e 67 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ng xFetch refere
2000: 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  nces */.  HANDLE
2010: 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
2020: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
2030: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
2040: 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a  memory mapping *
2050: 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65  /.  void *pMapRe
2060: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
2070: 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79    /* Area memory
2080: 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c   mapped */.  sql
2090: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
20a0: 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  ize;       /* Us
20b0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70  able size of map
20c0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
20d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
20e0: 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a  apSizeActual; /*
20f0: 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   Actual size of 
2100: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f  mapped region */
2110: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2120: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
2130: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46   /* Configured F
2140: 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76  CNTL_MMAP_SIZE v
2150: 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
2160: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2170: 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46   values for winF
2180: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f  ile.ctrlFlags.*/
2190: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
21a0: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20  _RDONLY         
21b0: 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65   0x02   /* Conne
21c0: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
21d0: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ly */.#define WI
21e0: 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
21f0: 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20  L     0x04   /* 
2200: 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d  Persistent WAL m
2210: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ode */.#define W
2220: 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  INFILE_PSOW     
2230: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a         0x10   /*
2240: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2250: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2260: 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  E */../*. * The 
2270: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
2280: 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  er used by sqlit
2290: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
22a0: 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e  ebug().. */.#ifn
22b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
22c0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20  _DBG_BUF_SIZE.# 
22d0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
22e0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
22f0: 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d  E   ((int)(4096-
2300: 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a  sizeof(DWORD))).
2310: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2320: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
2330: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
2340: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
2350: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
2360: 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65   * the data dire
2370: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
2380: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
2390: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
23a0: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
23b0: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
23c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
23d0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
23e0: 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (1).#endif../*.
23f0: 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65   * The value use
2400: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77  d with sqlite3_w
2410: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
2420: 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20  ry() to specify 
2430: 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70  that. * the temp
2440: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
2450: 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65  should be change
2460: 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  d.. */.#ifndef S
2470: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
2480: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
2490: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
24a0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
24b0: 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23  CTORY_TYPE (2).#
24c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20  endif../*. * If 
24d0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
24e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
24f0: 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  C on Windows, we
2500: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a   will use the. *
2510: 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41   various Win32 A
2520: 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e  PI heap function
2530: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72  s instead of our
2540: 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66   own.. */.#ifdef
2550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2560: 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74  LLOC../*. * If t
2570: 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  his is non-zero,
2580: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
2590: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
25a0: 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20  d by the native 
25b0: 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74  Win32. * allocat
25c0: 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74  or subsystem; ot
25d0: 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66  herwise, the def
25e0: 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61  ault process hea
25f0: 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20  p will be used. 
2600: 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67   This. * setting
2610: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77   has no effect w
2620: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  hen compiling fo
2630: 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66  r WinRT.  By def
2640: 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e  ault, this is en
2650: 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20  abled. * and an 
2660: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
2670: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
2680: 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63   store all alloc
2690: 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  ated data.. *. *
26a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a  *************. *
26f0: 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20   WARNING: It is 
2700: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
2710: 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2720: 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d   setting is non-
2730: 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20  zero and the. * 
2740: 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53           winMemS
2750: 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  hutdown function
2760: 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e   is called (e.g.
2770: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
2780: 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20  shutdown. *     
2790: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20       function), 
27a0: 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61  all data that wa
27b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  s allocated usin
27c0: 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68  g the isolated h
27d0: 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  eap will. *     
27e0: 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d       be freed im
27f0: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e  mediately and an
2800: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63  y attempt to acc
2810: 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20  ess any of that 
2820: 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20  freed. *        
2830: 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f    data will almo
2840: 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73  st certainly res
2850: 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69  ult in an immedi
2860: 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61  ate access viola
2870: 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion.. *********
2880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  *****. */.#ifnde
28d0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
28e0: 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65  EAP_CREATE.#  de
28f0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2900: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20  2_HEAP_CREATE   
2910: 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a   (TRUE).#endif..
2920: 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61  /*. * The initia
2930: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  l size of the Wi
2940: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
2950: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
2960: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
2970: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2980: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
2990: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
29a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
29b0: 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49  INIT_SIZE ((SQLI
29c0: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
29d0: 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20  _SIZE) * \.     
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c    (SQLITE_DEFAUL
2a10: 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34  T_PAGE_SIZE) + 4
2a20: 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a  194304).#endif..
2a30: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
2a40: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  m size of the Wi
2a50: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
2a60: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
2a70: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
2a80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2a90: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
2aa0: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
2ab0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
2ac0: 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e  AX_SIZE  (0).#en
2ad0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65  dif../*. * The e
2ae0: 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73  xtra flags to us
2af0: 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68  e in calls to th
2b00: 65 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49  e Win32 heap API
2b10: 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  s.  This value m
2b20: 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f  ay be. * zero fo
2b30: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65  r the default be
2b40: 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e  havior.. */.#ifn
2b50: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2b60: 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64  _HEAP_FLAGS.#  d
2b70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2b80: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20  32_HEAP_FLAGS   
2b90: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f    (0).#endif.../
2ba0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44  *.** The winMemD
2bb0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74  ata structure st
2bc0: 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ores information
2bd0: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2be0: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a   Win32-specific.
2bf0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  ** sqlite3_mem_m
2c00: 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74  ethods implement
2c10: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
2c20: 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  f struct winMemD
2c30: 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a  ata winMemData;.
2c40: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
2c50: 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  a {.#ifndef NDEB
2c60: 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b  UG.  u32 magic1;
2c70: 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62     /* Magic numb
2c80: 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72  er to detect str
2c90: 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f  ucture corruptio
2ca0: 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48  n. */.#endif.  H
2cb0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20  ANDLE hHeap; /* 
2cc0: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75  The handle to ou
2cd0: 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f  r heap. */.  BOO
2ce0: 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f  L bOwned;  /* Do
2cf0: 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70   we own the heap
2d00: 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69   (i.e. destroy i
2d10: 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20  t on shutdown)? 
2d20: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2d30: 47 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20  G.  u32 magic2; 
2d40: 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
2d50: 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75  r to detect stru
2d60: 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
2d70: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  . */.#endif.};..
2d80: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
2d90: 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41  define WINMEM_MA
2da0: 47 49 43 31 20 20 20 20 20 30 78 34 32 62 32 38  GIC1     0x42b28
2db0: 33 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d  30b.#define WINM
2dc0: 45 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78  EM_MAGIC2     0x
2dd0: 62 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a  bd4d7cf4.#endif.
2de0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
2df0: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65  inMemData win_me
2e00: 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64  m_data = {.#ifnd
2e10: 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d  ef NDEBUG.  WINM
2e20: 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69  EM_MAGIC1,.#endi
2e30: 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a  f.  NULL, FALSE.
2e40: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2e50: 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a   ,WINMEM_MAGIC2.
2e60: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64  #endif.};..#ifnd
2e70: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
2e80: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2e90: 67 69 63 31 28 29 20 61 73 73 65 72 74 28 20 77  gic1() assert( w
2ea0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
2eb0: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
2ec0: 31 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  1 ).#define winM
2ed0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29  emAssertMagic2()
2ee0: 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d   assert( win_mem
2ef0: 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49  _data.magic2==WI
2f00: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64  NMEM_MAGIC2 ).#d
2f10: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2f20: 72 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65  rtMagic()  winMe
2f30: 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b  mAssertMagic1();
2f40: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2f50: 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65  ic2();.#else.#de
2f60: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2f70: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
2f80: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
2f90: 65 74 44 61 74 61 50 74 72 28 29 20 20 26 77 69  etDataPtr()  &wi
2fa0: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69  n_mem_data.#defi
2fb0: 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  ne winMemGetHeap
2fc0: 28 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64  ()     win_mem_d
2fd0: 61 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e  ata.hHeap.#defin
2fe0: 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  e winMemGetOwned
2ff0: 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61  ()    win_mem_da
3000: 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69  ta.bOwned..stati
3010: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61  c void *winMemMa
3020: 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29  lloc(int nBytes)
3030: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
3040: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
3050: 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76  Prior);.static v
3060: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
3070: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
3080: 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74   int nBytes);.st
3090: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53  atic int winMemS
30a0: 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74  ize(void *p);.st
30b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52  atic int winMemR
30c0: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73  oundup(int n);.s
30d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
30e0: 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44  Init(void *pAppD
30f0: 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ata);.static voi
3100: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
3110: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
3120: 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ;..const sqlite3
3130: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
3140: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
3150: 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f  (void);.#endif /
3160: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
3170: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
3180: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
3190: 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61  riable is (norma
31a0: 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e  lly) set once an
31b0: 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a  d never changes.
31c0: 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20  ** thereafter.  
31d0: 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  It records wheth
31e0: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  er the operating
31f0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78   system is Win9x
3200: 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a  .** or WinNT..**
3210: 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69  .** 0:   Operati
3220: 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77  ng system unknow
3230: 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61  n..** 1:   Opera
3240: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3250: 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70  in9x..** 2:   Op
3260: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
3270: 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49  s WinNT..**.** I
3280: 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c  n order to facil
3290: 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e  itate testing on
32a0: 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c   a WinNT system,
32b0: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
32c0: 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c  e.** can manuall
32d0: 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65  y set this value
32e0: 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65   to 1 to emulate
32f0: 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e   Win98 behavior.
3300: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3310: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
3320: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
3330: 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  #elif !SQLITE_OS
3340: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
3350: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a  E_OS_WINRT && \.
3360: 20 20 20 20 20 20 64 65 66 69 6e 65 64 28 53 51        defined(SQ
3370: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3380: 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28  NSI) && defined(
3390: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
33a0: 5f 57 49 44 45 29 0a 73 74 61 74 69 63 20 69 6e  _WIDE).static in
33b0: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
33c0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
33d0: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
33e0: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
33f0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3400: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
3410: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3420: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
3430: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
3440: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
3450: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3460: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
3470: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
3480: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
3490: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
34a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
34b0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
34c0: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
34d0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
34e0: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
34f0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
3500: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
3510: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
3520: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
3530: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
3540: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
3550: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
3560: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
3570: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
3580: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
3590: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
35a0: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
35b0: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
35c0: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
35d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
35e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35f0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3600: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3610: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
3620: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
3630: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
3640: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
3650: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3660: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
3670: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
3680: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
3690: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
36a0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
36b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
36c0: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
36d0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
36e0: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
36f0: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
3700: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
3710: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
3720: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3730: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3740: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3750: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
3760: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
3770: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
3780: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
3790: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
37a0: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
37b0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
37c0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
37d0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
37e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
37f0: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
3800: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
3810: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
3820: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
3830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3840: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3860: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3890: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
38a0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
38b0: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
38c0: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
38d0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
38e0: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
38f0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3900: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3910: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
3920: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3930: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
3940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3950: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
3960: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3970: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
39a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
39b0: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
39c0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
39d0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
39e0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
39f0: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
3a00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3a10: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
3a20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3a30: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
3a40: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
3a50: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
3a60: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3a70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3a80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a90: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
3aa0: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3ab0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3ac0: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
3ad0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3ae0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3af0: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3b00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3b30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3b40: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
3b50: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
3b60: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
3b70: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
3b80: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
3b90: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
3ba0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
3bb0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3bc0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3bd0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3be0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3bf0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3c00: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3c10: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
3c20: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
3c30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3c40: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3c80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3c90: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
3ca0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3cb0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
3cc0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3cd0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3ce0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3cf0: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3d00: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
3d10: 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f  )..#if (!SQLITE_
3d20: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3d30: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3d40: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
3d50: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
3d60: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
3d70: 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )).  { "CreateFi
3d80: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
3d90: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
3da0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20  eFileMappingA,  
3db0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3dc0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
3dd0: 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  ppingA",      (S
3de0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3e10: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
3e20: 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44  eMappingA ((HAND
3e30: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
3e40: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
3e50: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
3e60: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
3e70: 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53  DWORD,LPCSTR))aS
3e80: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
3e90: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3ea0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
3eb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3ec0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3ed0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
3ee0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
3ef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3f00: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
3f10: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3f20: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3f30: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3f40: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
3f50: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3f60: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
3f70: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3fa0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3fb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28  teFileMappingW (
3fc0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3fd0: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
3fe0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3ff0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
4000: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53  WORD,DWORD,LPCWS
4010: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  TR))aSyscall[7].
4020: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4030: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4040: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4050: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4060: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  ).  { "CreateMut
4070: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
4080: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
4090: 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20  MutexW,         
40a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
40b0: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
40c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
40d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
40f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4100: 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65  ine osCreateMute
4110: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
4120: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
4130: 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c  ATTRIBUTES,BOOL,
4140: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53   \.        LPCWS
4150: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
4160: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4170: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4180: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4190: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
41b0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
41c0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
41d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
41e0: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
41f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4200: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4210: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4220: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4230: 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28  osDeleteFileA ((
4240: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4250: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39  CSTR))aSyscall[9
4260: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4270: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4280: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4290: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
42a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
42b0: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
42c0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
42d0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
42e0: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
42f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4300: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4320: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4330: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20  e osDeleteFileW 
4340: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4350: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4360: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
4370: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4380: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4390: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
43a0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c  e", (SYSCALL)Fil
43b0: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
43c0: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
43d0: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
43e0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
43f0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4420: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
4430: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4440: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4450: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4460: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
4470: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
4480: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
4490: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
44a0: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
44b0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
44c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65     (SYSCALL)File
44d0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
44e0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
44f0: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
4500: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
4510: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4540: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
4550: 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42  ToSystemTime ((B
4560: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
4570: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
4580: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
4590: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
45a0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
45b0: 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66  { "FlushFileBuff
45c0: 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59  ers",        (SY
45d0: 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42  SCALL)FlushFileB
45e0: 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30  uffers,        0
45f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
4600: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20  lushFileBuffers 
4610: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4620: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
4630: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
4640: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4650: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4660: 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  I).  { "FormatMe
4670: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
4680: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4690: 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20  tMessageA,      
46a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
46b0: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
46c0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
46d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4700: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
4710: 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49  sageA ((DWORD(WI
4720: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
4730: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
4740: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
4750: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
4760: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
4770: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4790: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
47a0: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
47b0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
47c0: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
47d0: 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  geW,          0 
47e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
47f0: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
4800: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4840: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20  sFormatMessageW 
4850: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4860: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
4870: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WORD,DWORD,LPWST
4880: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
4890: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
48a0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
48b0: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
48c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
48d0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
48e0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4900: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
4910: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
4920: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4930: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
4940: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4950: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4960: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4970: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4980: 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28  osFreeLibrary ((
4990: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d  BOOL(WINAPI*)(HM
49a0: 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ODULE))aSyscall[
49b0: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
49c0: 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72   { "GetCurrentPr
49d0: 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53  ocessId",     (S
49e0: 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e  YSCALL)GetCurren
49f0: 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20  tProcessId,     
4a00: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4a10: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
4a20: 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41  sId ((DWORD(WINA
4a30: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4a40: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
4a50: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4a60: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
4a70: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4a80: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
4a90: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4aa0: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4ab0: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4ac0: 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceA,       0 },.
4ad0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4ae0: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
4af0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4b20: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4b30: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20  tDiskFreeSpaceA 
4b40: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4b50: 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  LPCSTR,LPDWORD,L
4b60: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
4b70: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
4b80: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  D))aSyscall[18].
4b90: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4ba0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4bb0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
4bc0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4bd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4be0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69  WIDE).  { "GetDi
4bf0: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4c00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4c10: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c  tDiskFreeSpaceW,
4c20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4c30: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
4c40: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
4c50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4c80: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
4c90: 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f  kFreeSpaceW ((BO
4ca0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
4cb0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
4cc0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
4cd0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
4ce0: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
4cf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4d00: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4d10: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4d20: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4d30: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4d40: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4d50: 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c  utesA,      0 },
4d60: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4d70: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
4d80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4da0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4db0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4dc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4dd0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
4de0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
4df0: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
4e00: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4e10: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4e20: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4e30: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4e40: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4e50: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4e60: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4e70: 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesW,      0 },.
4e80: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4e90: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
4ea0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ed0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ee0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4ef0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4f00: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
4f10: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
4f20: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4f30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4f40: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
4f50: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4f60: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65  ,    (SYSCALL)Ge
4f70: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4f80: 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  xW,    0 },.#els
4f90: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
4fa0: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
4fb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4fe0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
4ff0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28  eAttributesExW (
5000: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
5010: 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45  PCWSTR,GET_FILEE
5020: 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c  X_INFO_LEVELS, \
5030: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
5040: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
5050: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5060: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5070: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5090: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
50a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
50b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
50c0: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
50d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
50e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
50f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5100: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5110: 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28  osGetFileSize ((
5120: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
5130: 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61  ANDLE,LPDWORD))a
5140: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
5150: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5160: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
5170: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5180: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5190: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
51a0: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
51b0: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
51c0: 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30  hNameA,        0
51d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
51e0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
51f0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
5200: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5210: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5220: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5230: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
5240: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
5250: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
5260: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
5270: 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61    LPSTR*))aSysca
5280: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
5290: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
52a0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
52b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
52c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
52d0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
52e0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
52f0: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5300: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
5310: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
5320: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5330: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
5340: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5350: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5360: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5370: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5380: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
5390: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
53a0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
53b0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
53c0: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
53d0: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
53e0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
53f0: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
5400: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
5410: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
5420: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5430: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
5440: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
5450: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5460: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
5470: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5480: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5490: 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51  XTENSION).#if SQ
54a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
54b0: 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64  /* The GetProcAd
54c0: 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65  dressA() routine
54d0: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
54e0: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
54f0: 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  . */.  { "GetPro
5500: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5520: 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20  ProcAddressA,   
5530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5540: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
5550: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
5560: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
5570: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
5580: 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73  e.  ** an ANSI s
5590: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
55a0: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
55b0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20   setting */.  { 
55c0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
55d0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
55e0: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
55f0: 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ss,          0 }
5600: 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20  ,.#endif.#else. 
5610: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
5620: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
5630: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5660: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64  fine osGetProcAd
5670: 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43  dressA ((FARPROC
5680: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
5690: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  E, \.        LPC
56a0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  STR))aSyscall[27
56b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
56c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
56d0: 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  T.  { "GetSystem
56e0: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
56f0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
5700: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  temInfo,        
5710: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5720: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
5730: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5740: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5760: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5770: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
5780: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
5790: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
57a0: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
57b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
57c0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
57d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
57e0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
57f0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
5800: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5810: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
5820: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
5830: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
5840: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
5850: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5860: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
5870: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5880: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
5890: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
58a0: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
58b0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
58c0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
58d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5900: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
5910: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
5920: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
5930: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
5940: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
5950: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
5960: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5970: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
5980: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
5990: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
59a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
59b0: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
59c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
59d0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
59e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
59f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5a20: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
5a30: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
5a40: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
5a50: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
5a60: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5a80: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5a90: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5aa0: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5ab0: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5ac0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
5ad0: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
5ae0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5af0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5b10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5b30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5b40: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
5b50: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
5b60: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
5b70: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
5b80: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5b90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5ba0: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5bc0: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
5bd0: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
5be0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5bf0: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
5c00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5c10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5c20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5c30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5c40: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
5c50: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5c60: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
5c70: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
5c80: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5c90: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5ca0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5cb0: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
5cc0: 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20 20  IONEX) && \.    
5cd0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
5ce0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
5cf0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5d00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d10: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
5d20: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
5d30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5d40: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
5d50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5d60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5d70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5d80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5d90: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
5da0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5db0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
5dc0: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
5dd0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
5de0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5df0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5e00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5e10: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
5e20: 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 64  .        defined
5e30: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
5e40: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53  TVERSIONEX) && S
5e50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5e60: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
5e70: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5e80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e90: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
5ea0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5eb0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
5ec0: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
5ed0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5f00: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5f10: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
5f20: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
5f30: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
5f40: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
5f50: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
5f60: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5f80: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
5f90: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5fa0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5fb0: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
5fc0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5fd0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5fe0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
5ff0: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
6000: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6010: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6020: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
6030: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6040: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
6050: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6060: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6070: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6080: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
60b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
60c0: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
60d0: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
60e0: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
60f0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
6100: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
6110: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6120: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6130: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
6140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6150: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6170: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6180: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6190: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
61c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
61d0: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
61e0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
61f0: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
6200: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
6210: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
6220: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6230: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
6240: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6250: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6260: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6270: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6280: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6290: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
62a0: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
62b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
62c0: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
62d0: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
62e0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
62f0: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
6300: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
6310: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
6320: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6330: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
6340: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6350: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6360: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6370: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6390: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
63a0: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
63b0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
63c0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
63d0: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
63e0: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
63f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6400: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
6410: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
6420: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6430: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
6440: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6450: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6460: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6470: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
64a0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
64b0: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
64c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
64d0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
64e0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
64f0: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
6500: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6510: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
6520: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6530: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
6540: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6550: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6560: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6570: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6580: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6590: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
65c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
65d0: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
65e0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
65f0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
6600: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
6610: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6620: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
6630: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
6640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
6650: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6660: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6670: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6680: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6690: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
66a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
66b0: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
66c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
66d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
66f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6700: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
6710: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6720: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
6730: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
6740: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6750: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6760: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6770: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6780: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6790: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
67a0: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
67b0: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
67c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
67d0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
67e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
67f0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6800: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
6810: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6840: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6850: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6860: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6870: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6880: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6890: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
68a0: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
68b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
68c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
68d0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
68e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
68f0: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6910: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6930: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6940: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
6950: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6960: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6970: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6980: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6990: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
69a0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
69b0: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
69c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
69d0: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
69f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6a00: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6a10: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a40: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6a50: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6a60: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6a70: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6a80: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6a90: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6aa0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6ab0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6ac0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6ad0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6ae0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6af0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b00: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6b10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6b20: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6b30: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6b40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6b70: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6b80: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6b90: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6ba0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6bb0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6bc0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6bd0: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6be0: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6bf0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6c00: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6c10: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6c20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6c30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6c40: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
6c50: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
6c60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6c70: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
6c80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
6c90: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
6ca0: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6cb0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6cc0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6cd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6ce0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6cf0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  MapViewOfFile ((
6d00: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
6d10: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
6d20: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
6d30: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6d40: 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e  call[49].pCurren
6d50: 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79  t)..  { "MultiBy
6d60: 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20  teToWideChar",  
6d70: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74     (SYSCALL)Mult
6d80: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c  iByteToWideChar,
6d90: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6da0: 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f  ne osMultiByteTo
6db0: 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57  WideChar ((int(W
6dc0: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
6dd0: 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50  RD,LPCSTR,int,LP
6de0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
6df0: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30  int))aSyscall[50
6e00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6e10: 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e   "QueryPerforman
6e20: 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53  ceCounter", (SYS
6e30: 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72  CALL)QueryPerfor
6e40: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20  manceCounter, 0 
6e50: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75  },..#define osQu
6e60: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
6e70: 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e  unter ((BOOL(WIN
6e80: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6e90: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29   LARGE_INTEGER*)
6ea0: 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43  )aSyscall[51].pC
6eb0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65  urrent)..  { "Re
6ec0: 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  adFile",        
6ed0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6ee0: 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20  )ReadFile,      
6ef0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6f00: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69  #define osReadFi
6f10: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6f20: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44  *)(HANDLE,LPVOID
6f30: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
6f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
6f50: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
6f60: 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [52].pCurrent)..
6f70: 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c    { "SetEndOfFil
6f80: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
6f90: 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66  SYSCALL)SetEndOf
6fa0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6fb0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6fc0: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28  sSetEndOfFile ((
6fd0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6fe0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
6ff0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
7000: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7010: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
7020: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
7030: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
7040: 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20  lePointer,      
7050: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7060: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
7070: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
7080: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
70b0: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
70c0: 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49  inter ((DWORD(WI
70d0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f  NAPI*)(HANDLE,LO
70e0: 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20  NG,PLONG, \.    
70f0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
7100: 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74  all[54].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 6c 65  S_WINRT.  { "Sle
7130: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
7140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7150: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
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 6c 65 65 70 22 2c  lse.  { "Sleep",
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 6c 65 65  ..#define osSlee
71d0: 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  p ((VOID(WINAPI*
71e0: 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  )(DWORD))aSyscal
71f0: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
7200: 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65  .  { "SystemTime
7210: 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20  ToFileTime",    
7220: 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54  (SYSCALL)SystemT
7230: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20  imeToFileTime,  
7240: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7250: 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
7260: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
7270: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53  NAPI*)(CONST SYS
7280: 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  TEMTIME*, \.    
7290: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
72a0: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
72b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
72c0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
72d0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
72e0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
72f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7300: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
7310: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
7320: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7330: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
7340: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7350: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7370: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
7380: 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a  ef osUnlockFile.
7390: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
73a0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
73b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
73c0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
73d0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
73e0: 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75  aSyscall[57].pCu
73f0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
7400: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7410: 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NCE.  { "UnlockF
7420: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
7430: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
7440: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
7450: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7460: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
7470: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
7480: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
74b0: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
74c0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
74d0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
74e0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
74f0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
7500: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
7510: 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  58].pCurrent)..#
7520: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7530: 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  CE || !defined(S
7540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
7550: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7560: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7570: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7580: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7590: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
75a0: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
75b0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
75c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
75e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
75f0: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
7600: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
7610: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
7620: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
7630: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
7640: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
7650: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7660: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7670: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7680: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7690: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
76a0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
76b0: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
76c0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
76d0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
76e0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
76f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7700: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
7710: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7720: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7740: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
7750: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7760: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7770: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7780: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7790: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
77a0: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
77b0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
77c0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
77d0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
77e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
77f0: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
7800: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7810: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7820: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
7830: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7860: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7870: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7880: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7890: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
78a0: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
78b0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
78c0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
78d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
78e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
78f0: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7900: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7910: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7920: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
7930: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7940: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7950: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7960: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7980: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7990: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
79a0: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
79b0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
79c0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
79d0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
79e0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
79f0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7a00: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
7a10: 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  LL)WaitForSingle
7a20: 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20 7d 2c  ObjectEx,   0 },
7a30: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
7a40: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
7a50: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
7a60: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7a70: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
7a80: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
7a90: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7aa0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7ab0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7ac0: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
7ad0: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
7ae0: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
7af0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
7b00: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7b10: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7b20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7b30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7b40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7b50: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
7b60: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7b70: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
7b80: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
7b90: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
7ba0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
7bb0: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
7bc0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7bd0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
7be0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7bf0: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
7c00: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
7c10: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
7c20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
7c30: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
7c40: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
7c50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7c60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7c70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7c80: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
7c90: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
7ca0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
7cb0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
7cc0: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
7cd0: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
7ce0: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
7cf0: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
7d00: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7d10: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
7d20: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
7d30: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7d40: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
7d50: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7d60: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20  wOfFileFromApp, 
7d70: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7d80: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7d90: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
7da0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7dc0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7dd0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
7de0: 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56  ileFromApp ((LPV
7df0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
7e00: 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  DLE,ULONG,ULONG6
7e10: 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  4, \.        SIZ
7e20: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 37  E_T))aSyscall[67
7e30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7e40: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7e50: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
7e60: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
7e70: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
7e80: 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20  ile2,           
7e90: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7ea0: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7ec0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7ee0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7ef0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32  ne osCreateFile2
7f00: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7f10: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
7f20: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
7f30: 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45          LPCREATE
7f40: 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
7f50: 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63  ARAMETERS))aSysc
7f60: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
7f70: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
7f80: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
7f90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
7fa0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
7fb0: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
7fc0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
7fd0: 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61  YSCALL)LoadPacka
7fe0: 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20  gedLibrary,     
7ff0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8000: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
8010: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
8020: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
8030: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8040: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8050: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
8060: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45  ibrary ((HMODULE
8070: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
8080: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
8090: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d  RD))aSyscall[69]
80a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
80b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
80c0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
80d0: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
80e0: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43  SYSCALL)GetTickC
80f0: 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20  ount64,         
8100: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
8110: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
8120: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8130: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8150: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8160: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
8170: 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57  64 ((ULONGLONG(W
8180: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
8190: 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72  yscall[70].pCurr
81a0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
81b0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
81c0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
81d0: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
81e0: 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  L)GetNativeSyste
81f0: 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a  mInfo,     0 },.
8200: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61  #else.  { "GetNa
8210: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
8220: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8250: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
8260: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
8270: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
8280: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  )( \.        LPS
8290: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
82a0: 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65 6e  call[71].pCurren
82b0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
82c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
82d0: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70  _ANSI).  { "Outp
82e0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
82f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
8300: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8310: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
8320: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
8330: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
8340: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8370: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
8380: 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28  tDebugStringA ((
8390: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
83a0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  CSTR))aSyscall[7
83b0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
83c0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
83d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
83e0: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
83f0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
8400: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
8410: 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20  ebugStringW,    
8420: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8430: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
8440: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
8450: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8470: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8480: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
8490: 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57  StringW ((VOID(W
84a0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
84b0: 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43  )aSyscall[73].pC
84c0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
84d0: 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20  tProcessHeap",  
84e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
84f0: 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c  )GetProcessHeap,
8500: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
8510: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
8520: 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c  cessHeap ((HANDL
8530: 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  E(WINAPI*)(VOID)
8540: 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70 43  )aSyscall[74].pC
8550: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8560: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8570: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8580: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43  OMIT_WAL).  { "C
8590: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
85a0: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
85b0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
85c0: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
85d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
85e0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
85f0: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8600: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8610: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8620: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8630: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8640: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
8650: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
8660: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
8670: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
8680: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
8690: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
86a0: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
86b0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
86c0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
86d0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
86e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
86f0: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
8700: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
8710: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
8720: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e  l of the.** "win
8730: 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  32" VFSes.  Retu
8740: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
8750: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
8760: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
8770: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
8780: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
8790: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
87a0: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
87b0: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
87c0: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
87d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
87e0: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
87f0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
8800: 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f  otUsed,        /
8810: 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65  * The VFS pointe
8820: 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a  r.  Not used */.
8830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
8840: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
8850: 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65  /* Name of syste
8860: 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69  m call to overri
8870: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
8880: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77  syscall_ptr pNew
8890: 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72  Func  /* Pointer
88a0: 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63   to new system c
88b0: 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  all value */.){.
88c0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
88d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
88e0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20  ITE_NOTFOUND;.. 
88f0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8900: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  R(pNotUsed);.  i
8910: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
8920: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d     /* If no zNam
8930: 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74  e is given, rest
8940: 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63  ore all system c
8950: 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65  alls to their de
8960: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74  fault.    ** set
8970: 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e  tings and return
8980: 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20   NULL.    */.   
8990: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
89a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
89b0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
89c0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
89d0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
89e0: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
89f0: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  ].pDefault ){.  
8a00: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
8a10: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79  ].pCurrent = aSy
8a20: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8a30: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
8a40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
8a50: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65   If zName is spe
8a60: 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20  cified, operate 
8a70: 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20  on only the one 
8a80: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20  system call.    
8a90: 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ** specified..  
8aa0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
8ab0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
8ac0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
8ad0: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
8ae0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
8af0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
8b00: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
8b10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79  .        if( aSy
8b20: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8b30: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
8b40: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44    aSyscall[i].pD
8b50: 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c  efault = aSyscal
8b60: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
8b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8b90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
8ba0: 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46  wFunc==0 ) pNewF
8bb0: 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  unc = aSyscall[i
8bc0: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
8bd0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
8be0: 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46  pCurrent = pNewF
8bf0: 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  unc;.        bre
8c00: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
8c10: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
8c20: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
8c30: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
8c40: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  a system call.  
8c50: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
8c60: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  Name is not a.**
8c70: 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74   recognized syst
8c80: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e  em call name.  N
8c90: 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ULL is also retu
8ca0: 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74  rned if the syst
8cb0: 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75  em call.** is cu
8cc0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65  rrently undefine
8cd0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  d..*/.static sql
8ce0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
8cf0: 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
8d00: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
8d10: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
8d20: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
8d30: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
8d40: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
8d50: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
8d60: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
8d70: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
8d80: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
8d90: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
8da0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
8db0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
8dc0: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
8dd0: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
8de0: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
8df0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8e00: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
8e10: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
8e20: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
8e30: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
8e40: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
8e50: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
8e60: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
8e70: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
8e80: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
8e90: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
8ea0: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
8eb0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
8ec0: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
8ed0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
8ee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8ef0: 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79   char *winNextSy
8f00: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
8f10: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
8f20: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
8f30: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
8f40: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
8f50: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
8f60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
8f70: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
8f80: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
8f90: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
8fa0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
8fb0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
8fc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
8fd0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
8fe0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
8ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
9000: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
9010: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
9020: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
9030: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
9040: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  0;.}..#ifdef SQL
9050: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
9060: 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33  ./*.** If a Win3
9070: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68 61  2 native heap ha
9080: 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  s been configure
9090: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
90a0: 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f   will attempt to
90b0: 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74 2e 20  .** compact it. 
90c0: 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20 53   Upon success, S
90d0: 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20 62 65  QLITE_OK will be
90e0: 20 72 65 74 75 72 6e 65 64 2e 20 20 55 70 6f 6e   returned.  Upon
90f0: 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a   failure, one.**
9100: 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   of SQLITE_NOMEM
9110: 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
9120: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
9130: 4e 44 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  ND will be retur
9140: 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22 70 6e  ned.  The.** "pn
9150: 4c 61 72 67 65 73 74 22 20 61 72 67 75 6d 65 6e  Largest" argumen
9160: 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, if non-zero, 
9170: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
9180: 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  return the size 
9190: 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73  of the.** larges
91a0: 74 20 63 6f 6d 6d 69 74 74 65 64 20 66 72 65 65  t committed free
91b0: 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20 68 65   block in the he
91c0: 61 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f  ap, in bytes..*/
91d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
91e0: 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61 70 28  32_compact_heap(
91f0: 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67 65 73 74  LPUINT pnLargest
9200: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9210: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20  LITE_OK;.  UINT 
9220: 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 20 20  nLargest = 0;.  
9230: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20  HANDLE hHeap;.. 
9240: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
9250: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
9260: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
9270: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9280: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9290: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
92a0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
92b0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
92c0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
92d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
92e0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
92f0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
9300: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
9310: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9320: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
9330: 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49  #endif.#if !SQLI
9340: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
9350: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
9360: 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73 74 3d    if( (nLargest=
9370: 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28 68 48  osHeapCompact(hH
9380: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9390: 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29 3d 3d  2_HEAP_FLAGS))==
93a0: 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 6c  0 ){.    DWORD l
93b0: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
93c0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
93d0: 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
93e0: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
93f0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
9400: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
9410: 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61  led to HeapCompa
9420: 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c 20 68  ct (no space), h
9430: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
9440: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
9450: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  *)hHeap);.      
9460: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
9470: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
9480: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
9490: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 66  SQLITE_ERROR, "f
94a0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d  ailed to HeapCom
94b0: 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61 70  pact (%lu), heap
94c0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
94d0: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
94e0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
94f0: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20 72  )hHeap);.      r
9500: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
9510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
9520: 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  e.  sqlite3_log(
9530: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c  SQLITE_NOTFOUND,
9540: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9550: 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25 70  Compact, heap=%p
9560: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9570: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
9580: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
9590: 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a 20  TFOUND;.#endif. 
95a0: 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20 29   if( pnLargest )
95b0: 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e 4c   *pnLargest = nL
95c0: 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72 6e  argest;.  return
95d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
95e0: 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20   a Win32 native 
95f0: 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f  heap has been co
9600: 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66  nfigured, this f
9610: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74  unction will att
9620: 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74 72  empt to.** destr
9630: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
9640: 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e 33  it.  If the Win3
9650: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69 73  2 native heap is
9660: 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61 6e   not isolated an
9670: 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c 69  d/or.** the sqli
9680: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
9690: 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  ) function does 
96a0: 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f 2c  not return zero,
96b0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69 6c   SQLITE_BUSY wil
96c0: 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65 64  l.** be returned
96d0: 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73 20   and no changes 
96e0: 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
96f0: 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  the Win32 native
9700: 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71   heap..*/.int sq
9710: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73 65  lite3_win32_rese
9720: 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74 20  t_heap(){.  int 
9730: 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  rc;.  MUTEX_LOGI
9740: 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
9750: 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a 20   *pMaster; ) /* 
9760: 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63 20  The main static 
9770: 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58  mutex */.  MUTEX
9780: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
9790: 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20 20  mutex *pMem; )  
97a0: 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73 20    /* The memsys 
97b0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a  static mutex */.
97c0: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70    MUTEX_LOGIC( p
97d0: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
97e0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
97f0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
9800: 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54 45  ASTER); ).  MUTE
9810: 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d 20  X_LOGIC( pMem = 
9820: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
9830: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
9840: 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 20  TATIC_MEM); ).  
9850: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9860: 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
9870: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
9880: 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69 6e  ter(pMem);.  win
9890: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
98a0: 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47 65  ;.  if( winMemGe
98b0: 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26 26  tHeap()!=NULL &&
98c0: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
98d0: 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ) && sqlite3_mem
98e0: 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 7b  ory_used()==0 ){
98f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41  .    /*.    ** A
9900: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
9910: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  ere should be no
9920: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d   outstanding mem
9930: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
9940: 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 65  on.    ** the he
9950: 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 65  ap.  Also, since
9960: 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65 72   both the master
9970: 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63 6b   and memsys lock
9980: 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  s are currently.
9990: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65 6c      ** being hel
99a0: 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68 65  d by us, no othe
99b0: 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  r function (i.e.
99c0: 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68   from another th
99d0: 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20 20  read) should.   
99e0: 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20 65   ** be able to e
99f0: 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20 68  ven access the h
9a00: 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  eap.  Attempt to
9a10: 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63   destroy and rec
9a20: 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a 2a  reate our.    **
9a30: 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32 20   isolated Win32 
9a40: 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77 2e  native heap now.
9a50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
9a60: 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  rt( winMemGetHea
9a70: 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20  p()!=NULL );.   
9a80: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
9a90: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
9aa0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ab0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
9ac0: 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d 53  0 );.    winMemS
9ad0: 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47 65  hutdown(winMemGe
9ae0: 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20  tDataPtr());.   
9af0: 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47   assert( winMemG
9b00: 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20 29  etHeap()==NULL )
9b10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 77  ;.    assert( !w
9b20: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
9b30: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9b40: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
9b50: 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72  ed()==0 );.    r
9b60: 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28 77  c = winMemInit(w
9b70: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
9b80: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
9b90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
9ba0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
9bb0: 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73  !=NULL );.    as
9bc0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
9bd0: 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74  _OK || winMemGet
9be0: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
9bf0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
9c00: 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f  E_OK || sqlite3_
9c10: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30  memory_used()==0
9c20: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
9c30: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 57   /*.    ** The W
9c40: 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70  in32 native heap
9c50: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
9c60: 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20 6d  ied because it m
9c70: 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20 20  ay be in use..  
9c80: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
9c90: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
9ca0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9cb0: 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73 71  eave(pMem);.  sq
9cc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9cd0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
9ce0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
9cf0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
9d00: 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a  2_MALLOC */../*.
9d10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9d20: 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70 65   outputs the spe
9d30: 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73 74  cified (ANSI) st
9d40: 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33  ring to the Win3
9d50: 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69  2 debugger.** (i
9d60: 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f  f available)..*/
9d70: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
9d80: 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67  in32_write_debug
9d90: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75  (const char *zBu
9da0: 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20  f, int nBuf){.  
9db0: 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c  char zDbgBuf[SQL
9dc0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
9dd0: 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e  F_SIZE];.  int n
9de0: 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20  Min = MIN(nBuf, 
9df0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  (SQLITE_WIN32_DB
9e00: 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29  G_BUF_SIZE - 1))
9e10: 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61  ; /* may be nega
9e20: 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e  tive. */.  if( n
9e30: 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20  Min<-1 ) nMin = 
9e40: 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74  -1; /* all negat
9e50: 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d  ive values becom
9e60: 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72  e -1. */.  asser
9e70: 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e  t( nMin==-1 || n
9e80: 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53  Min==0 || nMin<S
9e90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
9ea0: 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20  BUF_SIZE );.#if 
9eb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
9ec0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
9ed0: 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20   if( nMin>0 ){. 
9ee0: 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75     memset(zDbgBu
9ef0: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
9f00: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
9f10: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
9f20: 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e  gBuf, zBuf, nMin
9f30: 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  );.    osOutputD
9f40: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67  ebugStringA(zDbg
9f50: 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Buf);.  }else{. 
9f60: 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67     osOutputDebug
9f70: 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20  StringA(zBuf);. 
9f80: 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64   }.#elif defined
9f90: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
9fa0: 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74  S_WIDE).  memset
9fb0: 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c  (zDbgBuf, 0, SQL
9fc0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
9fd0: 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20  F_SIZE);.  if ( 
9fe0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
9ff0: 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20 20  eChar(.         
a000: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
a010: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
a020: 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75  CP_OEMCP, 0, zBu
a030: 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69  f,.          nMi
a040: 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42  n, (LPWSTR)zDbgB
a050: 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  uf, SQLITE_WIN32
a060: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69  _DBG_BUF_SIZE/si
a070: 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20  zeof(WCHAR))<=0 
a080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
a090: 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62   }.  osOutputDeb
a0a0: 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53  ugStringW((LPCWS
a0b0: 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c  TR)zDbgBuf);.#el
a0c0: 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  se.  if( nMin>0 
a0d0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
a0e0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
a0f0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
a100: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
a110: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
a120: 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e  nMin);.    fprin
a130: 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c  tf(stderr, "%s",
a140: 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c   zDbgBuf);.  }el
a150: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
a160: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42  stderr, "%s", zB
a170: 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  uf);.  }.#endif.
a180: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a190: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73  lowing routine s
a1a0: 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72 72  uspends the curr
a1b0: 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20 61  ent thread for a
a1c0: 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69  t least ms.** mi
a1d0: 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69  lliseconds.  Thi
a1e0: 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
a1f0: 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65  to the Win32 Sle
a200: 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  ep() interface..
a210: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
a220: 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41  _WINRT.static HA
a230: 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20  NDLE sleepObj = 
a240: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f  NULL;.#endif..vo
a250: 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  id sqlite3_win32
a260: 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c  _sleep(DWORD mil
a270: 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20  liseconds){.#if 
a280: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
a290: 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d    if ( sleepObj=
a2a0: 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65  =NULL ){.    sle
a2b0: 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65  epObj = osCreate
a2c0: 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e  EventExW(NULL, N
a2d0: 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e  ULL, CREATE_EVEN
a2e0: 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a  T_MANUAL_RESET,.
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20  SYNCHRONIZE);.  
a320: 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65 65  }.  assert( slee
a330: 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  pObj!=NULL );.  
a340: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
a350: 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a  bjectEx(sleepObj
a360: 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  , milliseconds, 
a370: 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20  FALSE);.#else.  
a380: 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63  osSleep(millisec
a390: 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  onds);.#endif.}.
a3a0: 0a 44 57 4f 52 44 20 73 71 6c 69 74 65 33 57 69  .DWORD sqlite3Wi
a3b0: 6e 33 32 57 61 69 74 28 48 41 4e 44 4c 45 20 68  n32Wait(HANDLE h
a3c0: 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57 4f 52 44  Object){.  DWORD
a3d0: 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20 28 72   rc;.  while( (r
a3e0: 63 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  c = osWaitForSin
a3f0: 67 6c 65 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a  gleObjectEx(hObj
a400: 65 63 74 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20  ect, INFINITE,. 
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a430: 20 20 20 20 20 20 54 52 55 45 29 29 3d 3d 57 41        TRUE))==WA
a440: 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e  IT_IO_COMPLETION
a450: 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 72 63   ){}.  return rc
a460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
a470: 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f  n true (non-zero
a480: 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e  ) if we are runn
a490: 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c  ing under WinNT,
a4a0: 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a   Win2K, WinXP,.*
a4b0: 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74  * or WinCE.  Ret
a4c0: 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29  urn false (zero)
a4d0: 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39   for Win95, Win9
a4e0: 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a  8, or WinME..**.
a4f0: 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e  ** Here is an in
a500: 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76  teresting observ
a510: 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57  ation:  Win95, W
a520: 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20  in98, and WinME 
a530: 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  lack.** the Lock
a540: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42  FileEx() API.  B
a550: 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20  ut we can still 
a560: 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20  statically link 
a570: 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20  against that.** 
a580: 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77  API as long as w
a590: 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20  e don't call it 
a5a0: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e  when running Win
a5b0: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
a5c0: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
a5d0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
a5e0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
a5f0: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
a600: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
a610: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
a620: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
a630: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
a640: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
a650: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
a660: 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21  ) API..*/..#if !
a670: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
a680: 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45  IN32_GETVERSIONE
a690: 58 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 57 49  X) || !SQLITE_WI
a6a0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
a6b0: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
a6c0: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 53 51  ()  (1).#elif SQ
a6d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
a6e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a6f0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
a700: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
a710: 53 49 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  SI).# define osI
a720: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
a730: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a740: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
a750: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
a760: 28 29 20 20 28 30 29 0a 23 65 6c 73 65 0a 20 20  ()  (0).#else.  
a770: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 49 73 4e  static int osIsN
a780: 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66 28  T(void){.    if(
a790: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
a7a0: 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  ==0 ){.#if defin
a7b0: 65 64 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  ed(NTDDI_VERSION
a7c0: 29 20 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49  ) && NTDDI_VERSI
a7d0: 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 38  ON >= NTDDI_WIN8
a7e0: 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  .      OSVERSION
a7f0: 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOW sInfo;.   
a800: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
a810: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
a820: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
a830: 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e      osGetVersion
a840: 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a 23 65 6c  ExW(&sInfo);.#el
a850: 73 65 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  se.      OSVERSI
a860: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
a870: 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56       sInfo.dwOSV
a880: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
a890: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
a8a0: 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69        osGetVersi
a8b0: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 23  onExA(&sInfo);.#
a8c0: 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69  endif.      sqli
a8d0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49  te3_os_type = sI
a8e0: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
a8f0: 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57  ==VER_PLATFORM_W
a900: 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b  IN32_NT ? 2 : 1;
a910: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
a920: 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  n sqlite3_os_typ
a930: 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  e==2;.  }.#endif
a940: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a950: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
a960: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
a970: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  es of memory..*/
a980: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
a990: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
a9a0: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
a9b0: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
a9c0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
a9d0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
a9e0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
a9f0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
aa00: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
aa10: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
aa20: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
aa30: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
aa40: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
aa50: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
aa60: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
aa70: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
aa80: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
aa90: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
aaa0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
aab0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  ) );.#endif.  as
aac0: 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20  sert( nBytes>=0 
aad0: 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41  );.  p = osHeapA
aae0: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
aaf0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
ab00: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
ab10: 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29  tes);.  if( !p )
ab20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
ab30: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
ab40: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41  "failed to HeapA
ab50: 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28 25  lloc %u bytes (%
ab60: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
ab70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ab80: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
ab90: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
aba0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
abb0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
abc0: 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   Free memory..*/
abd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
abe0: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
abf0: 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20  rior){.  HANDLE 
ac00: 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  hHeap;..  winMem
ac10: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
ac20: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
ac30: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
ac40: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
ac50: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
ac60: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
ac70: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
ac80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
ac90: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
aca0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
acb0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
acc0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
acd0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
ace0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
acf0: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
ad00: 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20  f.  if( !pPrior 
ad10: 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73  ) return; /* Pas
ad20: 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61  sing NULL to Hea
ad30: 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e  pFree is undefin
ad40: 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73  ed. */.  if( !os
ad50: 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20  HeapFree(hHeap, 
ad60: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
ad70: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
ad80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ad90: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
ada0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
adb0: 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28  pFree block %p (
adc0: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73  pPrior, osGetLas
adf0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
ae00: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  )hHeap);.  }.}..
ae10: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
ae20: 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73   size of an exis
ae30: 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  ting memory allo
ae40: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
ae50: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
ae60: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
ae70: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  r, int nBytes){.
ae80: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
ae90: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
aea0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
aeb0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
aec0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
aed0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
aee0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
aef0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
af00: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
af10: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
af20: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
af30: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
af40: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
af50: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
af60: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
af70: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
af80: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
af90: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
afa0: 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69  nBytes>=0 );.  i
afb0: 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20  f( !pPrior ){.  
afc0: 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f    p = osHeapAllo
afd0: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
afe0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
aff0: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
b000: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b010: 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f  p = osHeapReAllo
b020: 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  c(hHeap, SQLITE_
b030: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
b040: 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f  , pPrior, (SIZE_
b050: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20  T)nBytes);.  }. 
b060: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73   if( !p ){.    s
b070: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
b080: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
b090: 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20   to %s %u bytes 
b0a0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
b0b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b0c0: 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52   pPrior ? "HeapR
b0d0: 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41  eAlloc" : "HeapA
b0e0: 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f  lloc", nBytes, o
b0f0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
b100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b110: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
b120: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
b130: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
b140: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f  the size of an o
b150: 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63  utstanding alloc
b160: 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e  ation, in bytes.
b170: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b180: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
b190: 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  p){.  HANDLE hHe
b1a0: 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a  ap;.  SIZE_T n;.
b1b0: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
b1c0: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
b1d0: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
b1e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
b1f0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
b200: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
b210: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
b220: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
b230: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
b240: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
b250: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
b260: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
b270: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
b280: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b290: 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23  P_FLAGS, p) );.#
b2a0: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20 29  endif.  if( !p )
b2b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d   return 0;.  n =
b2c0: 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65 61   osHeapSize(hHea
b2d0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b2e0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a  HEAP_FLAGS, p);.
b2f0: 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54    if( n==(SIZE_T
b300: 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  )-1 ){.    sqlit
b310: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
b320: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
b330: 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25  HeapSize block %
b340: 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  p (%lu), heap=%p
b350: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b360: 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45     p, osGetLastE
b370: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
b380: 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72  Heap);.    retur
b390: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
b3a0: 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a  n (int)n;.}../*.
b3b0: 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65  ** Round up a re
b3c0: 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68  quest size to th
b3d0: 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c  e next valid all
b3e0: 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f  ocation size..*/
b3f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
b400: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
b410: 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  {.  return n;.}.
b420: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
b430: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
b440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
b450: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
b460: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
b470: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
b480: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
b490: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
b4a0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
b4b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b4c0: 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74  _ERROR;.  assert
b4d0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
b4e0: 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic1==WINMEM_MA
b4f0: 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74  GIC1 );.  assert
b500: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d  ( pWinMemData->m
b510: 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic2==WINMEM_MA
b520: 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51  GIC2 );..#if !SQ
b530: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b540: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b550: 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20  AP_CREATE.  if( 
b560: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
b570: 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  eap ){.    DWORD
b580: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d   dwInitialSize =
b590: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b5a0: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20  AP_INIT_SIZE;.  
b5b0: 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75    DWORD dwMaximu
b5c0: 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73  mSize = (DWORD)s
b5d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
b5e0: 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66  ig.nHeap;.    if
b5f0: 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d  ( dwMaximumSize=
b600: 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61  =0 ){.      dwMa
b610: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49  ximumSize = SQLI
b620: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41  TE_WIN32_HEAP_MA
b630: 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73  X_SIZE;.    }els
b640: 65 20 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53  e if( dwInitialS
b650: 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ize>dwMaximumSiz
b660: 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69  e ){.      dwIni
b670: 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78  tialSize = dwMax
b680: 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  imumSize;.    }.
b690: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
b6a0: 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43  >hHeap = osHeapC
b6b0: 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e  reate(SQLITE_WIN
b6c0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20  32_HEAP_FLAGS,. 
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69       dwInitialSi
b700: 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ze, dwMaximumSiz
b710: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69  e);.    if( !pWi
b720: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
b730: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b740: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
b750: 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61  M,.          "fa
b760: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61  iled to HeapCrea
b770: 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d  te (%lu), flags=
b780: 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75  %u, initSize=%lu
b790: 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a  , maxSize=%lu",.
b7a0: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
b7b0: 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49  astError(), SQLI
b7c0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
b7d0: 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69  AGS, dwInitialSi
b7e0: 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77  ze,.          dw
b7f0: 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20  MaximumSize);.  
b800: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b810: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
b820: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
b830: 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20  bOwned = TRUE;. 
b840: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
b850: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
b860: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57  ;.  }.#else.  pW
b870: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
b880: 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48   = osGetProcessH
b890: 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57  eap();.  if( !pW
b8a0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
b8b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b8c0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
b8d0: 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65  ,.        "faile
b8e0: 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48  d to GetProcessH
b8f0: 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65  eap (%lu)", osGe
b900: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  tLastError());. 
b910: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b920: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57  _NOMEM;.  }.  pW
b930: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
b940: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73  d = FALSE;.  ass
b950: 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74  ert( !pWinMemDat
b960: 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e  a->bOwned );.#en
b970: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 57  dif.  assert( pW
b980: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
b990: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b9a0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
b9b0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
b9c0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
b9d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b9e0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
b9f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
ba00: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
ba10: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
ba20: 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  ate(pWinMemData-
ba30: 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  >hHeap, SQLITE_W
ba40: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ba50: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
ba60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ba70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
ba80: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  initialize this 
ba90: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
baa0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75  c void winMemShu
bab0: 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70  tdown(void *pApp
bac0: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
bad0: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
bae0: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
baf0: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
bb00: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
bb10: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
bb20: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
bb30: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
bb40: 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72  AGIC1 );.  asser
bb50: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
bb60: 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic2==WINMEM_M
bb70: 41 47 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20  AGIC2 );..  if( 
bb80: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bb90: 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ap ){.    assert
bba0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
bbb0: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
bbc0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
bbd0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
bbe0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
bbf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
bc00: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20  C_VALIDATE).    
bc10: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
bc20: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
bc30: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
bc40: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
bc50: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
bc60: 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e  dif.    if( pWin
bc70: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
bc80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  ){.      if( !os
bc90: 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e  HeapDestroy(pWin
bca0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20  MemData->hHeap) 
bcb0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
bcc0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
bcd0: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
bce0: 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75  HeapDestroy (%lu
bcf0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
bd20: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
bd30: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
bd40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
bd50: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
bd60: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
bd70: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
bd80: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
bd90: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
bda0: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
bdb0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
bdc0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
bdd0: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
bde0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
bdf0: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
be00: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
be10: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
be20: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
be30: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
be40: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
be50: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
be60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
be70: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
be80: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
be90: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
bea0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
beb0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
bec0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
bed0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
bee0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
bef0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
bf00: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
bf10: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
bf20: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
bf30: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
bf40: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
bf50: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
bf60: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
bf70: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
bf80: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
bf90: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
bfa0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
bfb0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
bfc0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
bfd0: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
bfe0: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
bff0: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
c000: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
c010: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
c020: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
c030: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
c040: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
c050: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
c060: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
c070: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
c080: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
c090: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
c0a0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
c0b0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
c0c0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
c0d0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
c0e0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
c0f0: 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e 55  atic LPWSTR winU
c100: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e  tf8ToUnicode(con
c110: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
c120: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  me){.  int nChar
c130: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
c140: 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68  Filename;..  nCh
c150: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
c160: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
c170: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
c180: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a  , -1, NULL, 0);.
c190: 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29    if( nChar==0 )
c1a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c1b0: 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e    }.  zWideFilen
c1c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
c1d0: 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73  locZero( nChar*s
c1e0: 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e  izeof(zWideFilen
c1f0: 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ame[0]) );.  if(
c200: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d   zWideFilename==
c210: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c220: 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d  0;.  }.  nChar =
c230: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
c240: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
c250: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
c260: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e   nChar);.  if( n
c2a0: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Char==0 ){.    s
c2b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
c2c0: 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  eFilename);.    
c2d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20  zWideFilename = 
c2e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c2f0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zWideFilename;.}
c300: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
c310: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
c320: 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  e to UTF-8.  Spa
c330: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
c340: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c350: 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
c360: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
c370: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
c380: 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54  har *winUnicodeT
c390: 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  oUtf8(LPCWSTR zW
c3a0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
c3b0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
c3c0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  r *zFilename;.. 
c3d0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
c3e0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
c3f0: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
c400: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
c410: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
c420: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
c430: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c440: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
c450: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
c460: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
c470: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
c480: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c490: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
c4a0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
c4b0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
c4c0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
c4d0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  , zFilename, nBy
c4e0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c500: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
c510: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
c520: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c530: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
c540: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
c550: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
c560: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
c570: 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20  Convert an ANSI 
c580: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
c590: 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73  oft Unicode, bas
c5a0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
c5b0: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
c5c0: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
c5d0: 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61  apis..** .** Spa
c5e0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
c5f0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c600: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
c610: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
c620: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
c630: 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69  STR winMbcsToUni
c640: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
c650: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
c660: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
c670: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
c680: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
c690: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
c6a0: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
c6b0: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
c6c0: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
c6d0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
c6e0: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
c6f0: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c720: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
c730: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
c740: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c750: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
c760: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
c770: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
c780: 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65  sizeof(zMbcsFile
c790: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
c7a0: 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d  ( zMbcsFilename=
c7b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c7c0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
c7d0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
c7e0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
c7f0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
c800: 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  -1, zMbcsFilenam
c810: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28     nByte);.  if(
c840: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
c850: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
c860: 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  bcsFilename);.  
c870: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
c880: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
c890: 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b  n zMbcsFilename;
c8a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
c8b0: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
c8c0: 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74  ode to multi-byt
c8d0: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
c8e0: 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ng, based on the
c8f0: 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20  .** user's ANSI 
c900: 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  codepage..**.** 
c910: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
c920: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
c930: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
c940: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
c950: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
c960: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
c970: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
c980: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
c990: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
c9a0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
c9b0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
c9c0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
c9d0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
c9e0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
c9f0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
ca00: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
ca10: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
ca20: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
ca30: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
ca40: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
ca50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ca60: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
ca70: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
ca80: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
ca90: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
caa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cab0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
cac0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
cad0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
cae0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
caf0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
cb20: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
cb30: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
cb40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
cb50: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
cb60: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
cb70: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
cb80: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
cb90: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
cba0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
cbb0: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
cbc0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
cbd0: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
cbe0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
cbf0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
cc00: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
cc10: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
cc20: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
cc30: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
cc40: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
cc50: 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  meUtf8;.  LPWSTR
cc60: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
cc70: 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73  mpWide = winMbcs
cc80: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
cc90: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
cca0: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
ccb0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
ccc0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 77  FilenameUtf8 = w
ccd0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
cce0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
ccf0: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
cd00: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
cd10: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a  ilenameUtf8;.}..
cd20: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54  /*.** Convert UT
cd30: 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65  F-8 to multibyte
cd40: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
cd50: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
cd60: 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  d the .** return
cd70: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
cd80: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
cd90: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
cda0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
cdb0: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
cdc0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
cdd0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
cde0: 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a  *zFilenameMbcs;.
cdf0: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
ce00: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
ce10: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
ce20: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ce30: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
ce40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ce50: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
ce60: 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Mbcs = winUnicod
ce70: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
ce80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
ce90: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
cea0: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d  eturn zFilenameM
ceb0: 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  bcs;.}../*.** Th
cec0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
ced0: 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
cee0: 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f  ory or the tempo
cef0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62  rary directory b
cf00: 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  ased on.** the p
cf10: 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74  rovided argument
cf20: 73 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67  s.  The type arg
cf30: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20  ument must be 1 
cf40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
cf50: 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65  the.** data dire
cf60: 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72  ctory or 2 in or
cf70: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74  der to set the t
cf80: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
cf90: 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a  ry.  The zValue.
cfa0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ** argument is t
cfb0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
cfc0: 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e  irectory to use.
cfd0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
cfe0: 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51  ue will be.** SQ
cff0: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
d000: 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssful..*/.int sq
d010: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
d020: 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20  directory(DWORD 
d030: 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56  type, LPCWSTR zV
d040: 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a  alue){.  char **
d050: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  ppDirectory = 0;
d060: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d070: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
d080: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
d090: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
d0a0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d0b0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
d0c0: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
d0d0: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
d0e0: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
d0f0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
d100: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
d110: 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69  ctory;.  }else i
d120: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
d130: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
d140: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
d150: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
d160: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
d170: 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73  ectory;.  }.  as
d180: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
d190: 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49  ry || type==SQLI
d1a0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
d1b0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20  RECTORY_TYPE.   
d1c0: 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d         || type==
d1d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
d1e0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
d1f0: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
d200: 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20  !ppDirectory || 
d210: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48  sqlite3MemdebugH
d220: 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74  asType(*ppDirect
d230: 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41  ory, MEMTYPE_HEA
d240: 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69  P) );.  if( ppDi
d250: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63  rectory ){.    c
d260: 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20  har *zValueUtf8 
d270: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  = 0;.    if( zVa
d280: 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d  lue && zValue[0]
d290: 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65   ){.      zValue
d2a0: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
d2b0: 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b  eToUtf8(zValue);
d2c0: 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c  .      if ( zVal
d2d0: 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20  ueUtf8==0 ){.   
d2e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d2f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
d300: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
d310: 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65  te3_free(*ppDire
d320: 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44  ctory);.    *ppD
d330: 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75  irectory = zValu
d340: 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72  eUtf8;.    retur
d350: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
d360: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d370: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
d380: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
d390: 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45  e of winGetLastE
d3a0: 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65  rrorMsg.** is ze
d3b0: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
d3c0: 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
d3d0: 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
d3e0: 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
d3f0: 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
d400: 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
d410: 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed)..*/.static i
d420: 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
d430: 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74  orMsg(DWORD last
d440: 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c  Errno, int nBuf,
d450: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
d460: 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  /* FormatMessage
d470: 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61   returns 0 on fa
d480: 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73  ilure.  Otherwis
d490: 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  e it.  ** return
d4a0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
d4b0: 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74  TCHARs written t
d4c0: 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a  o the output.  *
d4d0: 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64  * buffer, exclud
d4e0: 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ing the terminat
d4f0: 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20  ing null char.. 
d500: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65   */.  DWORD dwLe
d510: 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  n = 0;.  char *z
d520: 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Out = 0;..  if( 
d530: 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
d540: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
d550: 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57      WCHAR zTempW
d560: 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32  ide[SQLITE_WIN32
d570: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
d580: 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20  S+1];.    dwLen 
d590: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
d5a0: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
d5b0: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
d5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
d5e0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
d5f0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d610: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d630: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
d640: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20      zTempWide,. 
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
d6b0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
d6c0: 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20  MSG_CHARS,.     
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6e0: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73          0);.#els
d6f0: 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  e.    LPWSTR zTe
d700: 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20  mpWide = NULL;. 
d710: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
d720: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
d730: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
d740: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
d750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d760: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
d770: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
d780: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
d7b0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
d7c0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53             (LPWS
d850: 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a  TR) &zTempWide,.
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
d8a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
d8b0: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
d8c0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
d8d0: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
d8e0: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
d8f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
d900: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
d910: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  .      zOut = wi
d920: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
d930: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20  TempWide);.     
d940: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
d950: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21  nMalloc();.#if !
d960: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
d970: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
d980: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
d990: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
d9a0: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
d9b0: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
d9c0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64  zTempWide);.#end
d9d0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  if.    }.  }.#if
d9e0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
d9f0: 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
da00: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
da10: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  p = NULL;.    dw
da20: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
da30: 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45  ssageA(FORMAT_ME
da40: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
da50: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
da80: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
da90: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
dab0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
dac0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
daf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
db10: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a        (LPSTR) &z
db60: 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Temp,.          
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db80: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dba0: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
dbb0: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
dbc0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
dbd0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
dbe0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
dbf0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
dc00: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
dc10: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
dc20: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
dc30: 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
dc40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
dc50: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
dc60: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
dc70: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
dc80: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
dc90: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
dca0: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
dcb0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
dcc0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
dcd0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
dce0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
dcf0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
dd00: 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c  sError 0x%lx (%l
dd10: 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  u)", lastErrno, 
dd20: 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65  lastErrno);.  }e
dd30: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
dd40: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
dd50: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
dd60: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
dd70: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
dd80: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
dd90: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
dda0: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
ddb0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
ddc0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
ddd0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
dde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68  ;.}../*.**.** Th
ddf0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69  is function - wi
de00: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
de10: 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ) - is only ever
de20: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
de30: 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45  macro.** winLogE
de40: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rror()..**.** Th
de50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
de60: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
de70: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
de80: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  n OS function..*
de90: 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  * It logs a mess
dea0: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
deb0: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
dec0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
ded0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  alue of.** error
dee0: 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f   code and, if po
def0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
df00: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
df10: 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46  alent from .** F
df20: 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a  ormatMessage..**
df30: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
df40: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
df50: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
df60: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
df70: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
df80: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
df90: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
dfa0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
dfb0: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
dfc0: 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20  N). .** The two 
dfd0: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
dfe0: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
dff0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
e000: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
e010: 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68  ** failed and th
e020: 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
e030: 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69  e-system path, i
e040: 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e  f any..*/.#defin
e050: 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c  e winLogError(a,
e060: 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45  b,c,d)   winLogE
e070: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
e080: 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61  ,d,__LINE__).sta
e090: 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72  tic int winLogEr
e0a0: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
e0b0: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e0d0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
e0e0: 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  e */.  DWORD las
e0f0: 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20  tErrno,         
e100: 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20         /* Win32 
e110: 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20  last error */.  
e120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e130: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
e140: 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75  /* Name of OS fu
e150: 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c  nction that fail
e160: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
e170: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
e180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
e190: 70 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  path associated 
e1a0: 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20  with error */.  
e1b0: 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20  int iLine       
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e  /* Source line n
e1e0: 75 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f  umber where erro
e1f0: 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b  r occurred */.){
e200: 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30  .  char zMsg[500
e210: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
e220: 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64     /* Human read
e230: 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20  able error text 
e240: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e260: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e270: 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b  nter */..  zMsg[
e280: 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74  0] = 0;.  winGet
e290: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73  LastErrorMsg(las
e2a0: 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a  tErrno, sizeof(z
e2b0: 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61  Msg), zMsg);.  a
e2c0: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
e2d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
e2e0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
e2f0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28  ath = "";.  for(
e300: 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20  i=0; zMsg[i] && 
e310: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26  zMsg[i]!='\r' &&
e320: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20   zMsg[i]!='\n'; 
e330: 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d  i++){}.  zMsg[i]
e340: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
e350: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
e360: 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a     "os_win.c:%d:
e370: 20 28 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20   (%lu) %s(%s) - 
e380: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
e390: 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75  , lastErrno, zFu
e3a0: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a  nc, zPath, zMsg.
e3b0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
e3c0: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
e3d0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
e3e0: 69 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64  imes that a Read
e3f0: 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c  File(), WriteFil
e400: 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46  e(), and DeleteF
e410: 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65  ile().** will be
e420: 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69   retried followi
e430: 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72  ng a locking err
e440: 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61  or - probably ca
e450: 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69  used by .** anti
e460: 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20  virus software. 
e470: 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61   Also the initia
e480: 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74  l delay before t
e490: 68 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a  he first retry..
e4a0: 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63  ** The delay inc
e4b0: 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20  reases linearly 
e4c0: 77 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e  with each retry.
e4d0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
e4e0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
e4f0: 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ETRY.# define SQ
e500: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
e510: 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66  _RETRY 10.#endif
e520: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e530: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
e540: 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65  Y_DELAY.# define
e550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e560: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20  ERR_RETRY_DELAY 
e570: 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  25.#endif.static
e580: 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74   int winIoerrRet
e590: 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ry = SQLITE_WIN3
e5a0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73  2_IOERR_RETRY;.s
e5b0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65  tatic int winIoe
e5c0: 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53  rrRetryDelay = S
e5d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
e5e0: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a  R_RETRY_DELAY;..
e5f0: 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f  /*.** The "winIo
e600: 65 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61  errCanRetry1" ma
e610: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 64  cro is used to d
e620: 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 70 61  etermine if a pa
e630: 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20  rticular I/O.** 
e640: 65 72 72 6f 72 20 63 6f 64 65 20 6f 62 74 61 69  error code obtai
e650: 6e 65 64 20 76 69 61 20 47 65 74 4c 61 73 74 45  ned via GetLastE
e660: 72 72 6f 72 28 29 20 69 73 20 65 6c 69 67 69 62  rror() is eligib
e670: 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69 65 64  le to be retried
e680: 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63  .  It.** must ac
e690: 63 65 70 74 20 74 68 65 20 65 72 72 6f 72 20 63  cept the error c
e6a0: 6f 64 65 20 44 57 4f 52 44 20 61 73 20 69 74 73  ode DWORD as its
e6b0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 61   only argument a
e6c0: 6e 64 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  nd should return
e6d0: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  .** non-zero if 
e6e0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
e6f0: 73 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e  s transient in n
e700: 61 74 75 72 65 20 61 6e 64 20 74 68 65 20 6f 70  ature and the op
e710: 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f  eration.** respo
e720: 6e 73 69 62 6c 65 20 66 6f 72 20 67 65 6e 65 72  nsible for gener
e730: 61 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  ating the origin
e740: 61 6c 20 65 72 72 6f 72 20 6d 69 67 68 74 20 73  al error might s
e750: 75 63 63 65 65 64 20 75 70 6f 6e 20 62 65 69 6e  ucceed upon bein
e760: 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 20 54  g.** retried.  T
e770: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
e780: 68 69 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  his macro should
e790: 20 62 65 20 61 20 76 61 72 69 61 62 6c 65 2e 0a   be a variable..
e7a0: 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  **.** Additional
e7b0: 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65  ly, a macro name
e7c0: 64 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  d "winIoerrCanRe
e7d0: 74 72 79 32 22 20 6d 61 79 20 62 65 20 64 65 66  try2" may be def
e7e0: 69 6e 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ined.  If it.** 
e7f0: 69 73 20 64 65 66 69 6e 65 64 2c 20 69 74 20 77  is defined, it w
e800: 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65 64  ill be consulted
e810: 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 6d   only when the m
e820: 61 63 72 6f 20 22 77 69 6e 49 6f 65 72 72 43 61  acro "winIoerrCa
e830: 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72 65 74 75  nRetry1".** retu
e840: 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 22  rns zero.  The "
e850: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
e860: 32 22 20 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70  2" macro is comp
e870: 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20  letely optional 
e880: 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73  and.** may be us
e890: 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 61 64  ed to include ad
e8a0: 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63  ditional error c
e8b0: 6f 64 65 73 20 69 6e 20 74 68 65 20 73 65 74 20  odes in the set 
e8c0: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72  that should.** r
e8d0: 65 73 75 6c 74 20 69 6e 20 74 68 65 20 66 61 69  esult in the fai
e8e0: 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72 61 74 69  ling I/O operati
e8f0: 6f 6e 20 62 65 69 6e 67 20 72 65 74 72 69 65 64  on being retried
e900: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
e910: 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20   If.** defined, 
e920: 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  the "winIoerrCan
e930: 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 6d 75  Retry2" macro mu
e940: 73 74 20 65 78 68 69 62 69 74 20 65 78 74 65 72  st exhibit exter
e950: 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a  nal semantics.**
e960: 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
e970: 6f 73 65 20 6f 66 20 74 68 65 20 22 77 69 6e 49  ose of the "winI
e980: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d  oerrCanRetry1" m
e990: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  acro..*/.#if !de
e9a0: 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61  fined(winIoerrCa
e9b0: 6e 52 65 74 72 79 31 29 0a 23 64 65 66 69 6e 65  nRetry1).#define
e9c0: 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72   winIoerrCanRetr
e9d0: 79 31 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52  y1(a) (((a)==ERR
e9e0: 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
e9f0: 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  )        || \.  
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
ea20: 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f  ==ERROR_SHARING_
ea30: 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c  VIOLATION)    ||
ea40: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
ea50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea60: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43   ((a)==ERROR_LOC
ea70: 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20  K_VIOLATION)    
ea80: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eaa0: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
eab0: 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29  R_DEV_NOT_EXIST)
eac0: 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
eaf0: 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44  =ERROR_NETNAME_D
eb00: 45 4c 45 54 45 44 29 20 20 20 20 20 20 7c 7c 20  ELETED)      || 
eb10: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f  ((a)==ERROR_SEM_
eb40: 54 49 4d 45 4f 55 54 29 20 20 20 20 20 20 20 20  TIMEOUT)        
eb50: 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20    || \.         
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52       ((a)==ERROR
eb80: 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48  _NETWORK_UNREACH
eb90: 41 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  ABLE)).#endif../
eba0: 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69  *.** If a ReadFi
ebb0: 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c  le() or WriteFil
ebc0: 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  e() error occurs
ebd0: 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  , invoke this ro
ebe0: 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20  utine.** to see 
ebf0: 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  if it should be 
ec00: 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e  retried.  Return
ec10: 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20   TRUE to retry. 
ec20: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
ec30: 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68   to give up with
ec40: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
ec50: 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 74 72  atic int winRetr
ec60: 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65  yIoerr(int *pnRe
ec70: 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72  try, DWORD *pErr
ec80: 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  or){.  DWORD e =
ec90: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
eca0: 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72  );.  if( *pnRetr
ecb0: 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74 72 79  y>=winIoerrRetry
ecc0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72   ){.    if( pErr
ecd0: 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72  or ){.      *pEr
ece0: 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20  ror = e;.    }. 
ecf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ed00: 0a 20 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43  .  if( winIoerrC
ed10: 61 6e 52 65 74 72 79 31 28 65 29 20 29 7b 0a 20  anRetry1(e) ){. 
ed20: 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
ed30: 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52  _sleep(winIoerrR
ed40: 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e  etryDelay*(1+*pn
ed50: 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a  Retry));.    ++*
ed60: 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74  pnRetry;.    ret
ed70: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64  urn 1;.  }.#if d
ed80: 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43  efined(winIoerrC
ed90: 61 6e 52 65 74 72 79 32 29 0a 20 20 65 6c 73 65  anRetry2).  else
eda0: 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e   if( winIoerrCan
edb0: 52 65 74 72 79 32 28 65 29 20 29 7b 0a 20 20 20  Retry2(e) ){.   
edc0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
edd0: 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74  leep(winIoerrRet
ede0: 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65  ryDelay*(1+*pnRe
edf0: 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e  try));.    ++*pn
ee00: 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72  Retry;.    retur
ee10: 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 1;.  }.#endif.
ee20: 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
ee30: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
ee40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
ee50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20  .}../*.** Log a 
ee60: 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20  I/O error retry 
ee70: 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  episode..*/.stat
ee80: 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f  ic void winLogIo
ee90: 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b  err(int nRetry){
eea0: 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b  .  if( nRetry ){
eeb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
eec0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a  (SQLITE_IOERR, .
eed0: 20 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25        "delayed %
eee0: 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61  dms for lock/sha
eef0: 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a  ring conflict",.
ef00: 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65        winIoerrRe
ef10: 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a  tryDelay*nRetry*
ef20: 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 20  (nRetry+1)/2.   
ef30: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53   );.  }.}..#if S
ef40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f  QLITE_OS_WINCE./
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69  *********.** Thi
efa0: 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69  s section contai
efb0: 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43  ns code for WinC
efc0: 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21  E only..*/.#if !
efd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
efe0: 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
eff0: 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53  I) || !SQLITE_MS
f000: 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
f010: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20  ./*.** The MSVC 
f020: 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  CRT on Windows C
f030: 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  E may not have a
f040: 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e   localtime() fun
f050: 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72  ction.  So.** cr
f060: 65 61 74 65 20 61 20 73 75 62 73 74 69 74 75 74  eate a substitut
f070: 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  e..*/.#include <
f080: 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74  time.h>.struct t
f090: 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c  m *__cdecl local
f0a0: 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f  time(const time_
f0b0: 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63  t *t).{.  static
f0c0: 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20   struct tm y;.  
f0d0: 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54  FILETIME uTm, lT
f0e0: 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  m;.  SYSTEMTIME 
f0f0: 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  pTm;.  sqlite3_i
f100: 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20  nt64 t64;.  t64 
f110: 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74  = *t;.  t64 = (t
f120: 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30  64 + 11644473600
f130: 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54  )*10000000;.  uT
f140: 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20  m.dwLowDateTime 
f150: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20  = (DWORD)(t64 & 
f160: 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75  0xFFFFFFFF);.  u
f170: 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  Tm.dwHighDateTim
f180: 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e  e= (DWORD)(t64 >
f190: 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54  > 32);.  osFileT
f1a0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
f1b0: 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20  me(&uTm,&lTm);. 
f1c0: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73   osFileTimeToSys
f1d0: 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54  temTime(&lTm,&pT
f1e0: 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20  m);.  y.tm_year 
f1f0: 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39  = pTm.wYear - 19
f200: 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d  00;.  y.tm_mon =
f210: 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b   pTm.wMonth - 1;
f220: 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70  .  y.tm_wday = p
f230: 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20  Tm.wDayOfWeek;. 
f240: 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d   y.tm_mday = pTm
f250: 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f  .wDay;.  y.tm_ho
f260: 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a  ur = pTm.wHour;.
f270: 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d    y.tm_min = pTm
f280: 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d  .wMinute;.  y.tm
f290: 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f  _sec = pTm.wSeco
f2a0: 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b  nd;.  return &y;
f2b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .}.#endif..#defi
f2c0: 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e  ne HANDLE_TO_WIN
f2d0: 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65  FILE(a) (winFile
f2e0: 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28  *)&((char*)a)[-(
f2f0: 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e  int)offsetof(win
f300: 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20  File,h)]../*.** 
f310: 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f  Acquire a lock o
f320: 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a  n the handle h.*
f330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
f340: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
f350: 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57  HANDLE h){.   DW
f360: 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f  ORD dwErr;.   do
f370: 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20   {.     dwErr = 
f380: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
f390: 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54  bject(h, INFINIT
f3a0: 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28  E);.   } while (
f3b0: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42  dwErr != WAIT_OB
f3c0: 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20  JECT_0 && dwErr 
f3d0: 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45  != WAIT_ABANDONE
f3e0: 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  D);.}./*.** Rele
f3f0: 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69  ase a lock acqui
f400: 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65  red by winceMute
f410: 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64  xAcquire().*/.#d
f420: 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78  efine winceMutex
f430: 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61  Release(h) Relea
f440: 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a  seMutex(h)../*.*
f450: 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74  * Create the mut
f460: 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65  ex and shared me
f470: 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  mory used for lo
f480: 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c  cking in the fil
f490: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
f4a0: 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  pFile.*/.static 
f4b0: 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74 65 4c  int winceCreateL
f4c0: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
f4d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
f4e0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50  le *pFile){.  LP
f4f0: 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57  WSTR zTok;.  LPW
f500: 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f  STR zName;.  DWO
f510: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
f520: 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46  BOOL bLogged = F
f530: 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e  ALSE;.  BOOL bIn
f540: 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e  it = TRUE;..  zN
f550: 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ame = winUtf8ToU
f560: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
f570: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
f580: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20  0 ){.    /* out 
f590: 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20  of memory */.   
f5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
f5b0: 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
f5c0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
f5d0: 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64   the local lockd
f5e0: 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ata */.  memset(
f5f0: 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30  &pFile->local, 0
f600: 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e  , sizeof(pFile->
f610: 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52  local));..  /* R
f620: 65 70 6c 61 63 65 20 74 68 65 20 62 61 63 6b 73  eplace the backs
f630: 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68 65 20  lashes from the 
f640: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77  filename and low
f650: 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a 20 74  ercase it.  ** t
f660: 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74 65 78  o derive a mutex
f670: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b   name. */.  zTok
f680: 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 28   = osCharLowerW(
f690: 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b  zName);.  for (;
f6a0: 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20  *zTok;zTok++){. 
f6b0: 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20     if (*zTok == 
f6c0: 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f  '\\') *zTok = '_
f6d0: 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65  ';.  }..  /* Cre
f6e0: 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d  ate/open the nam
f6f0: 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46  ed mutex */.  pF
f700: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73  ile->hMutex = os
f710: 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e 55 4c  CreateMutexW(NUL
f720: 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29  L, FALSE, zName)
f730: 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ;.  if (!pFile->
f740: 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70 46 69  hMutex){.    pFi
f750: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f760: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
f770: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
f780: 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ee(zName);.    r
f790: 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
f7a0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
f7b0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f7c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f7d0: 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
f7e0: 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69  reateLock1", zFi
f7f0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20  lename);.  }..  
f800: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
f810: 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74  utex before cont
f820: 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63  inuing */.  winc
f830: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
f840: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
f850: 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
f860: 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
f870: 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
f880: 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
f890: 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20  s etc are .  ** 
f8a0: 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20  case-sensitive, 
f8b0: 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
f8c0: 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63  f that by upperc
f8d0: 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20  asing the mutex 
f8e0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73  name.  ** and us
f8f0: 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20  ing that as the 
f900: 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69  shared filemappi
f910: 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ng name..  */.  
f920: 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61  osCharUpperW(zNa
f930: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
f940: 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65  hared = osCreate
f950: 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56  FileMappingW(INV
f960: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
f970: 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  E, NULL,.       
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
f9b0: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
f9c0: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
f9f0: 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53  Name);  ..  /* S
fa00: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
fa10: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
fa20: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
fa30: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
fa40: 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62   it .  ** must b
fa50: 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a  e zero-initializ
fa60: 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e  ed */.  lastErrn
fa70: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
fa80: 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74  or();.  if (last
fa90: 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41  Errno == ERROR_A
faa0: 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a  LREADY_EXISTS){.
fab0: 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53      bInit = FALS
fac0: 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
fad0: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a  3_free(zName);..
fae0: 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65    /* If we succe
faf0: 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74  eded in making t
fb00: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
fb10: 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e   handle, map it.
fb20: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
fb30: 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  >hShared ){.    
fb40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20  pFile->shared = 
fb50: 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61  (winceLock*)osMa
fb60: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
fb70: 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20  e->hShared, .   
fb80: 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
fb90: 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
fba0: 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
fbb0: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
fbc0: 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
fbd0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
fbe0: 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
fbf0: 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
fc00: 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
fc10: 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
fc20: 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
fc30: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
fc40: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
fc50: 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
fc60: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
fc70: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fc80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fc90: 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
fca0: 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
fcb0: 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
fcc0: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
fcd0: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
fce0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
fcf0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
fd00: 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
fd10: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
fd20: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
fd30: 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
fd40: 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
fd50: 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
fd60: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
fd70: 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
fd80: 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
fd90: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
fda0: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
fdb0: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
fdc0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
fdd0: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
fde0: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
fe00: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
fe10: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
fe20: 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
fe30: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
fe40: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
fe50: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
fe60: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
fe70: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
fe80: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
fe90: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
fea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
feb0: 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ERR;.  }.  .  /*
fec0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
fed0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
fee0: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
fef0: 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69  to */.  if( bIni
ff00: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
ff10: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
ff20: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
ff30: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
ff40: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
ff50: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
ff60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ff70: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74  K;.}../*.** Dest
ff80: 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20  roy the part of 
ff90: 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61  winFile that dea
ffa0: 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f  ls with wince lo
ffb0: 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  cks.*/.static vo
ffc0: 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  id winceDestroyL
ffd0: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
ffe0: 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65  le){.  if (pFile
fff0: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f  ->hMutex){.    /
10000 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
10010 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
10020 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
10030 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
10040 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
10050 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64  ng blocks should
10060 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74   probably assert
10070 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   in debug mode, 
10080 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20  but they.       
10090 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69  are to cleanup i
100a0 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73  n case any locks
100b0 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a   remained open *
100c0 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
100d0 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29  >local.nReaders)
100e0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
100f0 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
10100 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
10110 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
10120 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20  Reserved){.     
10130 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10140 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
10150 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
10160 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50  (pFile->local.bP
10170 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70  ending){.      p
10180 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
10190 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
101a0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
101b0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
101c0 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46  usive){.      pF
101d0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
101e0 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
101f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
10200 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20  e-reference and 
10210 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f  close our copy o
10220 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  f the shared mem
10230 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ory handle */.  
10240 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46    osUnmapViewOfF
10250 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  ile(pFile->share
10260 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  d);.    osCloseH
10270 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
10280 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  ared);..    /* D
10290 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74  one with the mut
102a0 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
102b0 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
102c0 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a  e->hMutex);    .
102d0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
102e0 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
102f0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
10300 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  tex = NULL;.  }.
10310 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70  }../* .** An imp
10320 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
10330 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50  he LockFile() AP
10340 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
10350 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
10360 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
10370 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
10380 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
10390 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
103a0 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
103b0 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
103c0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
103d0 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
103e0 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
103f0 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  oLockHigh.){.  w
10400 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
10410 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
10420 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
10430 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
10440 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
10450 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
10460 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
10470 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
10480 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
10490 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
104a0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
104b0 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
104c0 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
104d0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
104e0 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e  .  /* Wanting an
104f0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
10500 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
10510 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
10520 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
10530 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62  .       && nNumb
10540 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
10550 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
10560 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69  RED_SIZE){.    i
10570 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10580 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20  ->nReaders == 0 
10590 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  && pFile->shared
105a0 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
105b0 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  0){.       pFile
105c0 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
105d0 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
105e0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
105f0 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  .bExclusive = TR
10600 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75  UE;.       bRetu
10610 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
10620 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
10630 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b  a read-only lock
10640 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
10650 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10660 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
10670 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20  _FIRST &&.      
10680 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79       nNumberOfBy
10690 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
106a0 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
106b0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
106c0 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
106d0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
106e0 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
106f0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10700 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
10710 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  1){.        pFil
10720 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
10730 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ers ++;.      }.
10740 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
10750 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
10760 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e  .  /* Want a pen
10770 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ding lock? */.  
10780 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
10790 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
107a0 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
107b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
107c0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
107d0 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
107e0 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e   /* If no pendin
107f0 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  g lock has been 
10800 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61  acquired, then a
10810 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20  cquire it */.   
10820 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
10830 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20  ed->bPending == 
10840 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
10850 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
10860 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ng = TRUE;.     
10870 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
10880 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
10890 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
108a0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
108b0 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65    /* Want a rese
108c0 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  rved lock? */.  
108d0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
108e0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
108f0 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
10900 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
10910 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
10920 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
10930 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
10940 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
10950 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69  = 0) {.      pFi
10960 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10970 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  erved = TRUE;.  
10980 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
10990 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  .bReserved = TRU
109a0 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
109b0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
109c0 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
109d0 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
109e0 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
109f0 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
10a00 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
10a10 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f  tion of the Unlo
10a20 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69  ckFile API of Wi
10a30 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
10a40 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
10a50 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c  eUnlockFile(.  L
10a60 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a  PHANDLE phFile,.
10a70 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
10a80 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
10a90 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67   dwFileOffsetHig
10aa0 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  h,.  DWORD nNumb
10ab0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
10ac0 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
10ad0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10ae0 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  lockHigh.){.  wi
10af0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
10b00 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
10b10 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
10b20 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
10b30 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
10b40 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
10b50 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
10b60 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
10b70 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
10b80 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
10b90 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
10ba0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
10bb0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
10bc0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
10bd0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
10be0 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f   a reader lock o
10bf0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
10c00 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ock */.  if (dwF
10c10 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
10c20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
10c30 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64  RST){.    /* Did
10c40 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c   we have an excl
10c50 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
10c60 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10c70 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
10c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
10c90 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10ca0 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
10cb0 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a  D)SHARED_SIZE);.
10cc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
10cd0 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  al.bExclusive = 
10ce0 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
10cf0 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
10d00 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
10d10 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
10d20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TRUE;.    }..   
10d30 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20   /* Did we just 
10d40 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f  have a reader lo
10d50 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ck? */.    else 
10d60 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10d70 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
10d80 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
10d90 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
10da0 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
10db0 52 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  RED_SIZE.       
10dc0 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72        || nNumber
10dd0 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
10de0 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20  ow == 1);.      
10df0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
10e00 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
10e10 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10e20 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a  .nReaders == 0).
10e30 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
10e40 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
10e50 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
10e60 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
10e70 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
10e80 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73    }..  /* Releas
10e90 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ing a pending lo
10ea0 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
10eb0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
10ec0 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
10ed0 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
10ee0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
10ef0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
10f00 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
10f10 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
10f20 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
10f30 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
10f40 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
10f50 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10f60 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
10f70 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
10f80 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10f90 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e   }.  /* Releasin
10fa0 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  g a reserved loc
10fb0 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
10fc0 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10fd0 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
10fe0 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
10ff0 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
11000 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
11010 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
11020 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
11030 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
11040 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
11050 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
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 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
11080 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
11090 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
110a0 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
110b0 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
110c0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
110d0 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
110e0 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  /*.** End of the
110f0 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f   special code fo
11100 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  r wince.********
11110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11150 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
11160 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11170 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20   */../*.** Lock 
11180 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a  a file region..*
11190 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
111a0 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nLockFile(.  LPH
111b0 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
111c0 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44  DWORD flags,.  D
111d0 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a  WORD offsetLow,.
111e0 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69    DWORD offsetHi
111f0 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  gh,.  DWORD numB
11200 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  ytesLow,.  DWORD
11210 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b   numBytesHigh.){
11220 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
11230 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INCE.  /*.  ** N
11240 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
11250 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
11260 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
11270 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
11280 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20  Win32.  **      
11290 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20   API LockFile.. 
112a0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
112b0 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  ceLockFile(phFil
112c0 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
112d0 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
11300 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
11310 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
11320 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
11330 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
11340 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
11350 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
11360 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
11370 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
11380 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
11390 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
113a0 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
113b0 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  LockFileEx(*phFi
113c0 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75  le, flags, 0, nu
113d0 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
113e0 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b  tesHigh, &ovlp);
113f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
11400 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28  turn osLockFile(
11410 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  *phFile, offsetL
11420 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20  ow, offsetHigh, 
11430 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20  numBytesLow,.   
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
11460 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
11470 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66  /*.** Unlock a f
11480 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a  ile region.. */.
11490 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55  static BOOL winU
114a0 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
114b0 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
114c0 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c  DWORD offsetLow,
114d0 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48  .  DWORD offsetH
114e0 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  igh,.  DWORD num
114f0 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52  BytesLow,.  DWOR
11500 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29  D numBytesHigh.)
11510 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
11520 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINCE.  /*.  ** 
11530 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
11540 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
11550 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
11560 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
11570 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20   Win32.  **     
11580 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65    API UnlockFile
11590 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
115a0 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
115b0 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
115c0 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  w, offsetHigh,. 
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
115f0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
11600 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
11610 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
11620 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
11630 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
11640 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
11650 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
11660 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
11670 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
11680 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
11690 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
116a0 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  turn osUnlockFil
116b0 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20  eEx(*phFile, 0, 
116c0 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
116d0 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70  BytesHigh, &ovlp
116e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
116f0 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46  return osUnlockF
11700 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66  ile(*phFile, off
11710 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
11720 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
11730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11740 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
11750 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  sHigh);.  }.#end
11760 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  if.}../*********
11770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117b0 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  ****.** The next
117c0 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
117d0 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  es implement the
117e0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65   I/O methods spe
117f0 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65  cified.** by the
11800 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
11810 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a  ods object..****
11820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
11870 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66  ** Some Microsof
11880 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b  t compilers lack
11890 20 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e   this definition
118a0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56  ..*/.#ifndef INV
118b0 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
118c0 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49  INTER.# define I
118d0 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
118e0 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29  POINTER ((DWORD)
118f0 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  -1).#endif../*.*
11900 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65  * Move the curre
11910 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  nt position of t
11920 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  he file handle p
11930 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
11940 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  st .** argument 
11950 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66 73 65  to offset iOffse
11960 74 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 6c  t within the fil
11970 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
11980 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a 2a 20  , return 0. .** 
11990 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 70  Otherwise, set p
119a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
119b0 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
119c0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
119d0 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 77  nt winSeekFile(w
119e0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  inFile *pFile, s
119f0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
11a00 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51 4c 49  fset){.#if !SQLI
11a10 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 4c 4f  TE_OS_WINRT.  LO
11a20 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20 20 20  NG upperBits;   
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11a40 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20 62 69   Most sig. 32 bi
11a50 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
11a60 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77 65 72   */.  LONG lower
11a70 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
11a80 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74 20 73        /* Least s
11a90 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e  ig. 32 bits of n
11aa0 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 44  ew offset */.  D
11ab0 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20 20 20  WORD dwRet;     
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ad0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
11ae0 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
11af0 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52 44 20  er() */.  DWORD 
11b00 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
11b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
11b20 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47  ue returned by G
11b30 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f  etLastError() */
11b40 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
11b50 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66 66 73  EK file=%p, offs
11b60 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c  et=%lld\n", pFil
11b70 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29 29 3b  e->h, iOffset));
11b80 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20 3d 20  ..  upperBits = 
11b90 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65 74 3e  (LONG)((iOffset>
11ba0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
11bb0 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20  f);.  lowerBits 
11bc0 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73 65 74  = (LONG)(iOffset
11bd0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
11be0 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69 74 79  .  /* API oddity
11bf0 3a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  : If successful,
11c00 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
11c10 29 20 72 65 74 75 72 6e 73 20 61 20 64 77 6f 72  ) returns a dwor
11c20 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  d .  ** containi
11c30 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32 2d  ng the lower 32-
11c40 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77 20  bits of the new 
11c50 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72 2c  file-offset. Or,
11c60 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20 20   if it fails,.  
11c70 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49 4e  ** it returns IN
11c80 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
11c90 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72 20  OINTER. However 
11ca0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53 44  according to MSD
11cb0 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44  N, .  ** INVALID
11cc0 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
11cd0 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20  R may also be a 
11ce0 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74  valid new offset
11cf0 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e  . So to determin
11d00 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
11d10 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74  an error has act
11d20 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20  ually occurred, 
11d30 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73  it is also neces
11d40 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20 20  sary to call .  
11d50 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
11d60 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20  )..  */.  dwRet 
11d70 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  = osSetFilePoint
11d80 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77  er(pFile->h, low
11d90 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69  erBits, &upperBi
11da0 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b  ts, FILE_BEGIN);
11db0 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d  ..  if( (dwRet==
11dc0 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
11dd0 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26  _POINTER.      &
11de0 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
11df0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
11e00 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b  )!=NO_ERROR)) ){
11e10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
11e20 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
11e30 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
11e40 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
11e50 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
11e60 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11e70 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
11e80 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
11e90 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
11ea0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
11eb0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
11ec0 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
11ed0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
11ee0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
11ef0 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
11f00 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
11f10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
11f20 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c  .  return 0;.#el
11f30 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d  se.  /*.  ** Sam
11f40 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65  e as above, exce
11f50 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70  pt that this imp
11f60 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b  lementation work
11f70 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a  s for WinRT..  *
11f80 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47  /..  LARGE_INTEG
11f90 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20  ER x;           
11fa0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
11fb0 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c  offset */.  BOOL
11fc0 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20   bRet;          
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
11fe0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
11ff0 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45   SetFilePointerE
12000 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64  x() */..  x.Quad
12010 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a  Part = iOffset;.
12020 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69    bRet = osSetFi
12030 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c  lePointerEx(pFil
12040 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45  e->h, x, 0, FILE
12050 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21  _BEGIN);..  if(!
12060 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65  bRet){.    pFile
12070 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
12080 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
12090 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
120a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
120b0 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
120c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
120d0 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c       "winSeekFil
120e0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
120f0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
12100 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
12110 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  c=SQLITE_IOERR_S
12120 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  EEK\n", pFile->h
12130 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ));.    return 1
12140 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
12150 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
12160 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
12170 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
12180 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
12190 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .}..#if SQLITE_M
121a0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f  AX_MMAP_SIZE>0./
121b0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
121c0 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70  nces to VFS help
121d0 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20  er methods used 
121e0 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  for memory mappe
121f0 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69  d files */.stati
12200 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
12210 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74  (winFile*, sqlit
12220 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69  e3_int64);.stati
12230 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69  c int winUnmapfi
12240 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65  le(winFile*);.#e
12250 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ndif../*.** Clos
12260 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  e a file..**.** 
12270 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
12280 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74  hat an attempt t
12290 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  o close a handle
122a0 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73   might sometimes
122b0 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20  .** fail.  This 
122c0 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73  is a very unreas
122d0 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62  onable result, b
122e0 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f  ut Windows is no
122f0 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62  torious.** for b
12300 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c  eing unreasonabl
12310 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f  e so I do not do
12320 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68  ubt that it migh
12330 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a  t happen.  If.**
12340 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73   the close fails
12350 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31  , we pause for 1
12360 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
12370 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20  and try again.  
12380 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58  As.** many as MX
12390 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61  _CLOSE_ATTEMPT a
123a0 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65  ttempts to close
123b0 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20   the handle are 
123c0 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67  made before.** g
123d0 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74  iving up and ret
123e0 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
123f0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43  .*/.#define MX_C
12400 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73  LOSE_ATTEMPT 3.s
12410 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f  tatic int winClo
12420 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
12430 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  *id){.  int rc, 
12440 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69  cnt = 0;.  winFi
12450 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
12460 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
12470 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69  ert( id!=0 );.#i
12480 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
12490 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20  T_WAL.  assert( 
124a0 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29  pFile->pShm==0 )
124b0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
124c0 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c  t( pFile->h!=NUL
124d0 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49  L && pFile->h!=I
124e0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
124f0 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  LUE );.  OSTRACE
12500 28 28 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70  (("CLOSE file=%p
12510 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12520 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12530 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
12540 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
12550 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f  e);.#endif..  do
12560 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f  {.    rc = osClo
12570 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
12580 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c  h);.    /* Simul
12590 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30  ateIOError( rc=0
125a0 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41  ; cnt=MX_CLOSE_A
125b0 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20  TTEMPT; ); */.  
125c0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26  }while( rc==0 &&
125d0 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53   ++cnt < MX_CLOS
125e0 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71  E_ATTEMPT && (sq
125f0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
12600 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69  p(100), 1) );.#i
12610 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12620 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f  E.#define WINCE_
12630 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
12640 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72  S 3.  winceDestr
12650 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  oyLock(pFile);. 
12660 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c   if( pFile->zDel
12670 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20  eteOnClose ){.  
12680 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
12690 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20     while(.      
126a0 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c       osDeleteFil
126b0 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  eW(pFile->zDelet
126c0 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20  eOnClose)==0.   
126d0 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c       && osGetFil
126e0 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
126f0 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
12700 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
12710 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
12720 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
12730 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
12740 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
12750 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
12760 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
12770 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
12780 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
12790 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
127a0 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
127b0 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
127c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
127d0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
127e0 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
127f0 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
12800 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
12810 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
12820 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
12830 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
12840 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
12850 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  c ? SQLITE_OK.  
12860 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c            : winL
12870 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12880 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65  OERR_CLOSE, osGe
12890 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73          "winClos
128c0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
128d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
128e0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
128f0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
12900 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
12910 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
12920 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
12930 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
12940 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
12950 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
12960 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
12970 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
12980 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
129a0 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
129b0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
129d0 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
129e0 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
129f0 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
12a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
12a20 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
12a30 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
12a40 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
12a50 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
12a60 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
12a70 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
12a80 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50  _WINCE.  OVERLAP
12a90 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
12aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12ab0 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46  offset for ReadF
12ac0 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
12ad0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
12ae0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
12af0 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   /* file handle 
12b00 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64  */.  DWORD nRead
12b10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12b20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12b30 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
12b40 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20   read from file 
12b50 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
12b60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12b70 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12b80 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61  f retrys */..  a
12b90 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
12ba0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
12bb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
12bc0 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75  set>=0 );.  Simu
12bd0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
12be0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12bf0 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45  READ);.  OSTRACE
12c00 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
12c10 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
12c20 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c  nt=%d, offset=%l
12c30 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
12c40 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12c50 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
12c60 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
12c70 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
12c80 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12c90 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
12ca0 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
12cb0 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
12cc0 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
12cd0 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
12ce0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
12cf0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
12d00 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
12d10 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
12d20 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
12d30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
12d40 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
12d50 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
12d60 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
12d70 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
12d80 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
12d90 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
12da0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
12db0 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
12dc0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
12dd0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12df0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
12e00 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
12e10 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
12e20 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
12e30 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
12e40 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
12e50 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
12e60 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
12e70 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
12e80 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
12e90 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
12ea0 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
12eb0 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
12ec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
12ed0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
12ee0 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 77 69 6e  _WINCE.  if( win
12ef0 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
12f00 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f  offset) ){.    O
12f10 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
12f20 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12f30 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d  _FULL\n", pFile-
12f40 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
12f50 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
12f60 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
12f70 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
12f80 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
12f90 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
12fa0 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
12fb0 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
12fc0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
12fd0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
12fe0 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
12ff0 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
13000 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
13010 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
13020 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
13030 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
13040 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
13050 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
13060 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
13070 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
13080 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
13090 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
130a0 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
130b0 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
130c0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
130d0 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
130e0 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
130f0 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
13100 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
13110 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
13120 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
13130 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
13140 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
13150 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  READ\n", pFile->
13160 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13170 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
13180 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
13190 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
131a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
131b0 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61 64          "winRead
131c0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
131d0 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f  ;.  }.  winLogIo
131e0 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69  err(nRetry);.  i
131f0 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29  f( nRead<(DWORD)
13200 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e  amt ){.    /* Un
13210 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
13220 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
13230 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
13240 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
13250 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d  ar*)pBuf)[nRead]
13260 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b  , 0, amt-nRead);
13270 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
13280 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
13290 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
132a0 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c  RT_READ\n", pFil
132b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
132c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
132d0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
132e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
132f0 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
13300 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
13310 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
13320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13330 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
13340 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
13350 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
13360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
13370 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
13380 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
13390 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
133a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
133b0 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
133c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
133d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
133e0 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
133f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
13400 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
13410 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
13420 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
13430 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13460 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
13470 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
13480 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
13490 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
134a0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
134b0 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
134c0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
134d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
134e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
134f0 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
13500 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
13510 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
13520 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
13530 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
13540 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
13550 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13570 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
13580 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
13590 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
135a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
135b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
135c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
135d0 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
135e0 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
135f0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
13600 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
13610 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
13620 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
13630 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d  ount=%d, offset=
13640 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
13650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13660 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
13670 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
13680 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
13690 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
136a0 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
136b0 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
136c0 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65  of this write re
136d0 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
136e0 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
136f0 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
13700 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
13710 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
13720 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
13730 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
13740 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
13750 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
13760 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
13770 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
13780 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
13790 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
137a0 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
137b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
137c0 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25  RITE-MMAP file=%
137d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
137e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
137f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13800 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
13810 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
13820 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
13830 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
13840 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
13850 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
13860 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
13870 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
13880 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
13890 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
138a0 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
138b0 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
138c0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
138d0 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
138e0 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
138f0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20  E_OS_WINCE.  rc 
13900 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  = winSeekFile(pF
13910 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ile, offset);.  
13920 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c  if( rc==0 ){.#el
13930 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69  se.  {.#endif.#i
13940 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13950 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  CE.    OVERLAPPE
13960 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
13970 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
13980 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
13990 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
139a0 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
139b0 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
139c0 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
139d0 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
139e0 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
13a10 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
13a20 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
13a30 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
13a40 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
13a50 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
13a60 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
13a70 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
13a80 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
13a90 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
13aa0 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
13ab0 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
13ac0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13ad0 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  CE.    memset(&o
13ae0 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
13af0 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13b00 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
13b10 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
13b20 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
13b30 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72  fffff);.    over
13b40 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
13b50 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
13b60 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
13b70 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ffff);.#endif.. 
13b80 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
13b90 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
13ba0 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66  S_WINCE.      if
13bb0 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
13bc0 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
13bd0 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
13be0 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   ){.#else.      
13bf0 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
13c00 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
13c10 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
13c20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  &overlapped) ){.
13c30 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
13c40 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
13c50 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
13c60 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
13c70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
13c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
13c90 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30  ssert( nWrite==0
13ca0 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f   || nWrite<=(DWO
13cb0 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20  RD)nRem );.     
13cc0 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c   if( nWrite==0 |
13cd0 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29  | nWrite>(DWORD)
13ce0 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
13cf0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
13d00 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
13d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13d20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45     }.#if !SQLITE
13d30 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20  _OS_WINCE.      
13d40 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65  offset += nWrite
13d50 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70  ;.      overlapp
13d60 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
13d70 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
13d80 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f  ffffff);.      o
13d90 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
13da0 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
13db0 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
13dc0 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
13dd0 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e  .      aRem += n
13de0 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65  Write;.      nRe
13df0 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m -= nWrite;.   
13e00 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e   }.    if( nRem>
13e10 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
13e20 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
13e30 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
13e40 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
13e50 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ..  if( rc ){.  
13e60 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d    if(   ( pFile-
13e70 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f  >lastErrno==ERRO
13e80 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55  R_HANDLE_DISK_FU
13e90 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  LL ).       || (
13ea0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13eb0 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55  o==ERROR_DISK_FU
13ec0 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54  LL )){.      OST
13ed0 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
13ee0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13ef0 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  FULL\n", pFile->
13f00 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
13f10 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
13f20 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65  LITE_FULL, pFile
13f30 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
13f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f50 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31        "winWrite1
13f60 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
13f80 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
13f90 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
13fa0 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 20 70  OERR_WRITE\n", p
13fb0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13fc0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
13fd0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
13fe0 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
13ff0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
14010 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c  winWrite2", pFil
14020 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
14030 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
14040 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d  err(nRetry);.  }
14050 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
14060 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
14070 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
14080 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
14090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
140a0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
140b0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
140c0 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
140d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
140e0 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
140f0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
14100 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
14110 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
14120 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
14130 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
14140 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
14150 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14160 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
14170 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
14180 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
14190 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
141a0 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  rrno;..  assert(
141b0 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
141c0 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
141d0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
141e0 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54  TRUNCATE);.  OST
141f0 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
14200 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c  file=%p, size=%l
14210 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
14220 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14230 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c  ->h, nByte, pFil
14240 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
14250 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
14260 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
14270 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
14280 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
14290 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
142a0 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
142b0 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
142c0 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
142d0 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
142e0 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
142f0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
14300 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
14310 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
14320 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
14330 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
14340 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
14350 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
14360 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
14370 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
14380 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
14390 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
143a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
143b0 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
143c0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
143d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
143e0 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
143f0 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e  ls. */.  if( win
14400 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
14410 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
14420 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
14430 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
14440 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
14450 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
14460 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14470 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69  nTruncate1", pFi
14480 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
14490 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74  lse if( 0==osSet
144a0 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  EndOfFile(pFile-
144b0 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  >h) &&.         
144c0 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d     ((lastErrno =
144d0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
144e0 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d  ))!=ERROR_USER_M
144f0 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20  APPED_FILE) ){. 
14500 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14510 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
14520 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
14530 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
14540 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
14550 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
14580 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
14590 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
145a0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
145b0 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  >0.  /* If the f
145c0 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  ile was truncate
145d0 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c  d to a size smal
145e0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ler than the cur
145f0 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70  rently.  ** mapp
14600 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
14610 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
14620 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
14630 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
14640 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28  l.  ** use read(
14650 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f  ) and write() to
14660 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79   access data bey
14670 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66  ond this point f
14680 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f  rom now on..  */
14690 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
146a0 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74  apRegion && nByt
146b0 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e<pFile->mmapSiz
146c0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
146d0 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65  mmapSize = nByte
146e0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
146f0 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
14700 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  TE file=%p, rc=%
14710 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
14720 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
14730 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
14740 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
14750 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
14760 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
14770 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
14780 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
14790 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
147a0 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
147b0 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
147c0 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
147d0 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
147e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
147f0 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
14800 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
14810 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
14820 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
14830 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
14840 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
14850 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
14860 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
14870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14880 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  nSync(sqlite3_fi
14890 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
148a0 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s){.#ifndef SQLI
148b0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a  TE_NO_SYNC.  /*.
148c0 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77    ** Used only w
148d0 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
148e0 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
148f0 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20  d..   */.  BOOL 
14900 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  rc;.#endif.#if !
14910 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
14920 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
14930 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c  TE_NO_SYNC) || \
14940 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28 53 51  .    (defined(SQ
14950 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 64 65  LITE_TEST) && de
14960 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
14970 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  UG)).  /*.  ** U
14980 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
14990 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
149a0 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
149b0 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
149c0 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
149d0 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
149e0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
149f0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
14a00 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
14a10 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
14a20 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
14a30 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
14a40 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
14a50 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14a60 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
14a70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
14a80 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
14a90 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
14aa0 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
14ab0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
14ac0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
14ad0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
14ae0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
14af0 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
14b00 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
14b10 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
14b20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
14b30 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
14b40 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
14b50 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
14b60 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
14b70 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
14b80 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
14b90 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
14ba0 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d   file=%p, flags=
14bb0 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  %x, lock=%d\n",.
14bc0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
14bd0 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46 69 6c  ->h, flags, pFil
14be0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
14bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54  #ifndef SQLITE_T
14c00 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
14c10 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23  AMETER(flags);.#
14c20 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67  else.  if( (flag
14c30 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
14c40 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  SYNC_FULL ){.   
14c50 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
14c60 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20  c_count++;.  }. 
14c70 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
14c80 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
14c90 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
14ca0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
14cb0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
14cc0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
14cd0 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
14ce0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14cf0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41  _NO_SYNC.  OSTRA
14d00 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 66 69  CE(("SYNC-NOP fi
14d10 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
14d20 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
14d30 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
14d40 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
14d50 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
14d60 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
14d70 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
14d80 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
14d90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
14da0 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
14db0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14dc0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
14dd0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
14de0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14df0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
14e00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
14e10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
14e20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
14e30 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  C file=%p, rc=SQ
14e40 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
14e50 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14e60 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
14e70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14e80 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
14e90 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14eb0 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c 20       "winSync", 
14ec0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14ed0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
14ee0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  ** Determine the
14ef0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
14f00 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73   a file in bytes
14f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14f20 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  inFileSize(sqlit
14f30 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
14f40 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
14f50 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
14f60 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
14f70 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  )id;.  int rc = 
14f80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
14f90 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
14fa0 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d   assert( pSize!=
14fb0 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
14fc0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
14fd0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
14fe0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
14ff0 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
15000 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d  ze=%p\n", pFile-
15010 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69  >h, pSize));..#i
15020 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
15030 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
15040 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
15050 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
15060 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
15070 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
15080 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
15090 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
150c0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
150d0 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
150e0 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
150f0 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
15100 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
15110 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
15120 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
15130 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
15140 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
15150 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
15160 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
15190 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
151a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
151b0 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
151c0 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
151d0 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
151e0 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
151f0 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
15200 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
15210 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
15220 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
15230 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
15240 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
15250 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
15260 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
15270 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
15280 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
15290 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
152a0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
152b0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
152c0 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
152d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
152e0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
152f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
15300 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
15310 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
15320 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15340 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
15350 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
15360 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
15370 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
15380 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
15390 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64  =%p, *pSize=%lld
153a0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
153b0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
153c0 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20   pSize, *pSize, 
153d0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
153e0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
153f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b  c;.}../*.** LOCK
15400 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
15410 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e  ATELY is undefin
15420 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f  ed on some Windo
15430 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  ws systems..*/.#
15440 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
15450 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
15460 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
15470 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15480 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69  ELY 1.#endif..#i
15490 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45  fndef LOCKFILE_E
154a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20  XCLUSIVE_LOCK.# 
154b0 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
154c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32  EXCLUSIVE_LOCK 2
154d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
154e0 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c  istorically, SQL
154f0 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f 74  ite has used bot
15500 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61  h the LockFile a
15510 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  nd LockFileEx fu
15520 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e  nctions..** When
15530 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75   the LockFile fu
15540 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c  nction was used,
15550 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20 65   it was always e
15560 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a  xpected to fail.
15570 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
15580 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64  f the lock could
15590 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64   not be obtained
155a0 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61  .  Also, it alwa
155b0 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a  ys expected to.*
155c0 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  * obtain an excl
155d0 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65  usive lock.  The
155e0 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73 65  se flags are use
155f0 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46  d with the LockF
15600 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a  ileEx function.*
15610 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68  * and reflect th
15620 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73  ose expectations
15630 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65  ; therefore, the
15640 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  y should not be 
15650 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e  changed..*/.#ifn
15660 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
15670 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  ILE_FLAGS.# defi
15680 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
15690 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b  LE_FLAGS   (LOCK
156a0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
156b0 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20  ATELY | \.      
156c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156d0 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b              LOCK
156e0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
156f0 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OCK).#endif../*.
15700 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51  ** Currently, SQ
15710 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73  Lite never calls
15720 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
15730 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74  function without
15740 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20   wanting the.** 
15750 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d  call to fail imm
15760 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
15770 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
15780 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  btained..*/.#ifn
15790 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  def SQLITE_LOCKF
157a0 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65  ILEEX_FLAGS.# de
157b0 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
157c0 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f  FILEEX_FLAGS (LO
157d0 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
157e0 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a  DIATELY).#endif.
157f0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
15800 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a   reader lock..**
15810 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20 72   Different API r
15820 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c  outines are call
15830 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ed depending on 
15840 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
15850 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20  his.** is Win9x 
15860 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61  or WinNT..*/.sta
15870 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65  tic int winGetRe
15880 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
15890 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
158a0 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  s;.  OSTRACE(("R
158b0 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
158c0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  , lock=%d\n", pF
158d0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
158e0 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28  ocktype));.  if(
158f0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
15900 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
15910 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
15920 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
15930 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
15940 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
15950 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
15960 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20  Win32.    **    
15970 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45     API LockFileE
15980 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  x..    */.    re
15990 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  s = winceLockFil
159a0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
159b0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c  RED_FIRST, 0, 1,
159c0 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72   0);.#else.    r
159d0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
159e0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
159f0 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
15a00 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
15a10 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
15a20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
15a30 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e  ED_SIZE, 0);.#en
15a40 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
15a50 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
15a60 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
15a70 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c   int lk;.    sql
15a80 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
15a90 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29  sizeof(lk), &lk)
15aa0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  ;.    pFile->sha
15ab0 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73  redLockByte = (s
15ac0 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66  hort)((lk & 0x7f
15ad0 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f  ffffff)%(SHARED_
15ae0 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20  SIZE - 1));.    
15af0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
15b00 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
15b10 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
15b20 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
15b30 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
15b40 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
15b50 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
15b60 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
15b70 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20  if.  if( res == 
15b80 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
15b90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15ba0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
15bb0 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20    /* No need to 
15bc0 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f  log a failure to
15bd0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f   lock */.  }.  O
15be0 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
15bf0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  CK file=%p, rc=%
15c00 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
15c10 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
15c20 65 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  es)));.  return 
15c30 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  res;.}../*.** Un
15c40 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f  do a readlock.*/
15c50 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
15c60 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
15c70 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
15c80 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52   int res;.  DWOR
15c90 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f  D lastErrno;.  O
15ca0 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e  STRACE(("READ-UN
15cb0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
15cc0 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
15cd0 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
15ce0 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
15cf0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73  sNT() ){.    res
15d00 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
15d10 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
15d20 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
15d30 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
15d40 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
15d50 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
15d60 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d   else{.    res =
15d70 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
15d80 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
15d90 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
15da0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
15db0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
15dc0 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  if.  if( res==0 
15dd0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
15de0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
15df0 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f  ))!=ERROR_NOT_LO
15e00 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69  CKED) ){.    pFi
15e10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
15e20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
15e30 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15e40 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
15e50 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15e70 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64    "winUnlockRead
15e80 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Lock", pFile->zP
15e90 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  ath);.  }.  OSTR
15ea0 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43  ACE(("READ-UNLOC
15eb0 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  K file=%p, rc=%s
15ec0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
15ed0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65  qlite3ErrName(re
15ee0 73 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  s)));.  return r
15ef0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  es;.}../*.** Loc
15f00 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
15f10 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
15f20 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
15f30 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a  locktype - one.*
15f40 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
15f50 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
15f60 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
15f70 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
15f80 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
15f90 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
15fa0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
15fb0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
15fc0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
15fd0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
15fe0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
15ff0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
16000 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
16010 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
16020 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
16030 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
16040 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
16050 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
16060 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
16070 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
16080 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
16090 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
160a0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
160b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
160c0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
160d0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
160e0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
160f0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
16100 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
16110 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
16120 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
16130 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
16140 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
16150 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16160 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
16170 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
16180 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16190 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
161a0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
161b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
161c0 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
161d0 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55   lock.  The winU
161e0 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a  nlock() routine.
161f0 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f  ** erases all lo
16200 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20  cks at once and 
16210 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64  returns us immed
16220 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e  iately to lockin
16230 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74  g level 0..** It
16240 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
16250 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f   to lower the lo
16260 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20  cking level one 
16270 73 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20  step at a time. 
16280 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20   You.** must go 
16290 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b  straight to lock
162a0 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a  ing level 0..*/.
162b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
162c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
162d0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
162e0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
162f0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20  QLITE_OK;    /* 
16300 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
16310 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a   subroutines */.
16320 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
16330 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
16340 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20  lt of a Windows 
16350 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69  lock call */.  i
16360 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20  nt newLocktype; 
16370 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69        /* Set pFi
16380 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20  le->locktype to 
16390 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
163a0 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69  e exiting */.  i
163b0 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  nt gotPendingLoc
163c0 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66  k = 0;/* True if
163d0 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50   we acquired a P
163e0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73  ENDING lock this
163f0 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69   time */.  winFi
16400 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
16410 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52  File*)id;.  DWOR
16420 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
16430 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72  _ERROR;..  asser
16440 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53  t( id!=0 );.  OS
16450 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c  TRACE(("LOCK fil
16460 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64  e=%p, oldLock=%d
16470 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64  (%d), newLock=%d
16480 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16490 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
164a0 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
164b0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
164c0 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20  , locktype));.. 
164d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
164e0 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
164f0 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
16500 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
16510 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69  on the.  ** OsFi
16520 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
16530 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
16540 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
16550 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74  h, as.  ** sqlit
16560 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29  e3OsEnterMutex()
16570 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
16580 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
16590 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
165a0 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ype>=locktype ){
165b0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
165c0 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70  OCK-HELD file=%p
165d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
165e0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
165f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16600 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
16610 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
16620 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
16630 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
16640 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
16650 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
16660 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
16670 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
16680 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
16690 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
166a0 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
166b0 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
166c0 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
166d0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
166e0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
166f0 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
16700 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
16710 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
16720 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
16730 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
16740 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
16750 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
16760 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
16770 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
16780 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
16790 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
167a0 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
167b0 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
167c0 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20  ocktype;.  if(  
167d0 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
167e0 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20  e==NO_LOCK).    
167f0 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70   || (   (locktyp
16800 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
16810 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  K).         && (
16820 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
16830 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29  =RESERVED_LOCK))
16840 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
16850 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
16860 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
16870 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
16880 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
16890 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
168a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49             PENDI
168d0 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
168e0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
168f0 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
16900 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
16910 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20   lock.  This is 
16920 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20  needed to work. 
16930 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70       ** around p
16940 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
16950 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f  y indexing and/o
16960 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66  r anti-virus sof
16970 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a  tware on.      *
16980 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
16990 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79  s..      ** If y
169a0 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  ou are using thi
169b0 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65  s code as a mode
169c0 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76  l for alternativ
169d0 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a  e VFSes, do not.
169e0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68        ** copy th
169f0 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20  is retry logic. 
16a00 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e   It is a hack in
16a10 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f  tended for Windo
16a20 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  ws only..      *
16a30 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
16a40 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46  ("LOCK-PENDING-F
16a50 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75  AIL file=%p, cou
16a60 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  nt=%d, rc=%s\n",
16a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a80 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73  pFile->h, cnt, s
16a90 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 65  qlite3ErrName(re
16aa0 73 29 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  s)));.      if( 
16ab0 63 6e 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69  cnt ) sqlite3_wi
16ac0 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20  n32_sleep(1);.  
16ad0 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69    }.    gotPendi
16ae0 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20  ngLock = res;.  
16af0 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20    if( !res ){.  
16b00 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
16b10 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16b30 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72  * Acquire a shar
16b40 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ed lock.  */.  i
16b50 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
16b60 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  RED_LOCK && res 
16b70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16b80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
16b90 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  NO_LOCK );.    r
16ba0 65 73 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c  es = winGetReadL
16bb0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
16bc0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
16bd0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
16be0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
16bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
16c00 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16c10 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
16c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
16c30 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
16c40 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
16c50 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
16c60 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
16c70 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16c80 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
16c90 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
16ca0 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
16cb0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
16cc0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
16cd0 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  GS, RESERVED_BYT
16ce0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
16cf0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
16d00 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16d10 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
16d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16d30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16d40 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16d50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
16d60 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
16d70 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
16d80 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
16d90 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
16da0 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
16db0 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
16dc0 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
16dd0 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a  gLock = 0;.  }..
16de0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
16df0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20  EXCLUSIVE lock. 
16e00 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16e10 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
16e20 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
16e30 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16e40 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44  locktype>=SHARED
16e50 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
16e60 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64   = winUnlockRead
16e70 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
16e80 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
16e90 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
16ea0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
16eb0 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
16ec0 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
16ee0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
16ef0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
16f00 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16f10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
16f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16f30 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
16f40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16f50 20 20 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c       winGetReadL
16f60 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
16f70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
16f80 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
16f90 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61  PENDING lock tha
16fa0 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65  t ought to be re
16fb0 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a  leased, then.  *
16fc0 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77  * release it now
16fd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74  ..  */.  if( got
16fe0 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c  PendingLock && l
16ff0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
17000 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
17010 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
17020 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
17030 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
17040 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
17050 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c  e state of the l
17060 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20  ock has held in 
17070 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17080 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  tor then.  ** re
17090 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
170a0 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65  iate result code
170b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
170c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
170d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
170e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
170f0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
17100 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
17110 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54  TE_BUSY;.    OST
17120 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c  RACE(("LOCK-FAIL
17130 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64   file=%p, wanted
17140 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a  =%d, got=%d\n",.
17150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
17160 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
17170 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a   newLocktype));.
17180 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
17190 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c  ktype = (u8)newL
171a0 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41  ocktype;.  OSTRA
171b0 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25  CE(("LOCK file=%
171c0 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25  p, lock=%d, rc=%
171d0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
171e0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
171f0 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69  ->locktype, sqli
17200 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
17210 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17220 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17230 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
17240 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
17250 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
17260 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
17270 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
17280 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
17290 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
172a0 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
172b0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
172c0 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a  otherwise zero..
172d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
172e0 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
172f0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17300 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
17310 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
17320 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
17330 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a   (winFile*)id;..
17340 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17350 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
17360 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
17370 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f  RVEDLOCK; );.  O
17380 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
17390 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
173a0 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46  ResOut=%p\n", pF
173b0 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29  ile->h, pResOut)
173c0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
173d0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
173e0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
173f0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
17400 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f     rc = 1;.    O
17410 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
17420 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
17430 63 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  c=%d (local)\n",
17440 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
17450 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
17460 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
17470 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
17480 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
17490 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  S,RESERVED_BYTE,
174a0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
174b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 77  f( rc ){.      w
174c0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
174d0 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
174e0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
174f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
17500 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  !rc;.    OSTRACE
17510 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
17520 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 64 20 28  file=%p, rc=%d (
17530 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c  remote)\n", pFil
17540 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a  e->h, rc));.  }.
17550 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b    *pResOut = rc;
17560 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
17570 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
17580 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a  p, pResOut=%p, *
17590 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53  pResOut=%d, rc=S
175a0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
175b0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
175c0 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
175d0 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
175e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
175f0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
17600 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
17610 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
17620 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  d to locktype.  
17630 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
17640 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
17650 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
17660 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
17670 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
17680 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
17690 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
176a0 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
176b0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
176c0 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
176d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
176e0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  -op..**.** It is
176f0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
17700 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
17710 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65  o fail if the se
17720 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
17730 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66   is NO_LOCK.  If
17740 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17750 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c  ment is SHARED_L
17760 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OCK then this ro
17770 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72  utine.** might r
17780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17790 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  RR;.*/.static in
177a0 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69  t winUnlock(sqli
177b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
177c0 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
177d0 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69  nt type;.  winFi
177e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
177f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
17800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17810 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
17820 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17830 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
17840 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41  _LOCK );.  OSTRA
17850 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
17860 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
17870 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
17880 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
17890 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
178a0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
178b0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
178c0 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74   locktype));.  t
178d0 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
178e0 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
178f0 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_LOC
17900 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
17910 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17920 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17930 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
17940 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
17950 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
17960 4b 20 26 26 20 21 77 69 6e 47 65 74 52 65 61 64  K && !winGetRead
17970 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20  Lock(pFile) ){. 
17980 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
17990 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
179a0 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77  .  We should alw
179b0 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20  ays be able to. 
179c0 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72       ** reacquir
179d0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  e the read lock 
179e0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  */.      rc = wi
179f0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
17a00 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f  _IOERR_UNLOCK, o
17a10 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
17a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a30 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f          "winUnlo
17a40 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
17a50 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
17a60 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56  if( type>=RESERV
17a70 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
17a80 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
17a90 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
17aa0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
17ab0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
17ac0 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ype==NO_LOCK && 
17ad0 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
17ae0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
17af0 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
17b00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70  );.  }.  if( typ
17b10 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
17b20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17b30 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17b40 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
17b50 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46   1, 0);.  }.  pF
17b60 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
17b70 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
17b80 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
17b90 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
17ba0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
17bb0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
17bc0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
17bd0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
17be0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
17bf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
17c00 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
17c10 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
17c20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
17c30 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
17c40 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
17c50 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
17c60 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
17c70 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
17c80 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
17c90 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
17ca0 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
17cb0 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
17cc0 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
17cd0 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
17ce0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
17cf0 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a  odeBit(winFile *
17d00 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
17d10 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
17d20 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
17d30 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
17d40 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
17d50 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
17d60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
17d70 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
17d80 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
17d90 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
17da0 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
17db0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
17dc0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
17dd0 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
17de0 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74  o VFS helper met
17df0 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74 65  hods used for te
17e00 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
17e10 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
17e20 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
17e30 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a  e3_vfs *, char *
17e40 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
17e50 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
17e60 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f  id *);.static BO
17e70 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  OL winIsDriveLet
17e80 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73  terAndColon(cons
17e90 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a  t char *);../*.*
17ea0 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75  * Control and qu
17eb0 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ery of the open 
17ec0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
17ed0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
17ee0 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
17ef0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
17f00 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
17f10 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
17f20 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
17f30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 43  ;.  OSTRACE(("FC
17f40 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d  NTL file=%p, op=
17f50 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20  %d, pArg=%p\n", 
17f60 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41  pFile->h, op, pA
17f70 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20  rg));.  switch( 
17f80 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
17f90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
17fa0 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
17fb0 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
17fc0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
17fd0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
17fe0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
17ff0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18000 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
18010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18030 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
18040 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
18050 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70  t*)pArg = (int)p
18060 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
18070 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18080 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18090 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
180a0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
180b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
180c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
180d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
180e0 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
180f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
18100 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
18110 72 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  rg;.      OSTRAC
18120 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
18130 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
18140 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
18150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
18160 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18170 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18180 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
18190 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
181a0 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
181b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
181c0 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
181d0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
181e0 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
181f0 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
18200 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
18220 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
18230 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
18240 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
18250 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
18260 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
18270 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18280 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
18290 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
182a0 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
182b0 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
182c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
182d0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
182e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
182f0 7d 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  }.        OSTRAC
18300 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
18310 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
18320 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
18330 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
18340 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
18360 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18370 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18380 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18390 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
183a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
183b0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
183c0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
183d0 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
183e0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
183f0 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
18400 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
18410 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18420 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18430 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
18440 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
18450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18460 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
18470 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18480 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
18490 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
184a0 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
184b0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
184c0 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
184d0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
184e0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
184f0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18500 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18520 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18530 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
18540 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
18550 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
18560 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
18570 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
18580 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54  Name);.      OST
18590 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
185a0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
185b0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
185c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
185d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
185e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
185f0 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
18600 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69  RETRY: {.      i
18610 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41  nt *a = (int*)pA
18620 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  rg;.      if( a[
18630 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0]>0 ){.        
18640 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
18650 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
18660 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
18670 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b  = winIoerrRetry;
18680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18690 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
186a0 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
186b0 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
186c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
186d0 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49       a[1] = winI
186e0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
186f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
18700 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18710 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18720 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18730 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18750 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18760 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
18770 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68  NAME: {.      ch
18780 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a  ar *zTFile = 0;.
18790 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
187a0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46  inGetTempname(pF
187b0 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69  ile->pVfs, &zTFi
187c0 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
187d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
187e0 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
187f0 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
18800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
18810 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18820 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
18830 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
18840 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
18850 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18860 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49  ;.    }.#if SQLI
18870 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
18880 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
18890 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
188a0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20  ZE: {.      i64 
188b0 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34  newLimit = *(i64
188c0 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e  *)pArg;.      in
188d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
188e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
188f0 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62  imit>sqlite3Glob
18900 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20  alConfig.mxMmap 
18910 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69  ){.        newLi
18920 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  mit = sqlite3Glo
18930 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
18940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18950 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46  *(i64*)pArg = pF
18960 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
18970 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c  ;.      if( newL
18980 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69  imit>=0 && newLi
18990 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70  mit!=pFile->mmap
189a0 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65  SizeMax && pFile
189b0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
189c0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
189d0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e  >mmapSizeMax = n
189e0 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20  ewLimit;.       
189f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70   if( pFile->mmap
18a00 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
18a10 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
18a20 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
18a30 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69     rc = winMapfi
18a40 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
18a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18a60 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18a70 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18a80 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
18a90 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
18aa0 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
18ab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18ac0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53  .#endif.  }.  OS
18ad0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18ae0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18af0 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46  _NOTFOUND\n", pF
18b00 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
18b10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
18b20 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
18b30 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
18b40 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
18b50 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
18b60 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
18b70 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
18b80 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
18b90 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
18ba0 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
18bb0 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
18bc0 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
18bd0 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
18be0 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
18bf0 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
18c00 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
18c10 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
18c20 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
18c30 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
18c40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
18c50 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
18c60 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
18c70 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
18c80 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
18c90 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
18ca0 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
18cb0 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
18cc0 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
18cd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18ce0 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20  ){.  (void)id;. 
18cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
18d00 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
18d10 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
18d20 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
18d30 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
18d40 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
18d50 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
18d60 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
18d70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
18d80 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d  {.  winFile *p =
18d90 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
18da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18db0 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
18dc0 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20  _WHEN_OPEN |.   
18dd0 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46        ((p->ctrlF
18de0 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50  lags & WINFILE_P
18df0 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41  SOW)?SQLITE_IOCA
18e00 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
18e10 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20  WRITE:0);.}../* 
18e20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c  .** Windows will
18e30 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72   only let you cr
18e40 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d  eate file view m
18e50 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c  appings.** on al
18e60 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72  location size gr
18e70 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61  anularity bounda
18e80 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20  ries..** During 
18e90 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
18ea0 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79 73  ) we do a GetSys
18eb0 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20  temInfo().** to 
18ec0 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72  get the granular
18ed0 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ity size..*/.sta
18ee0 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20  tic SYSTEM_INFO 
18ef0 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66  winSysInfo;..#if
18f00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18f10 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  _WAL../*.** Help
18f20 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  er functions to 
18f30 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
18f40 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c  quish the global
18f50 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67   mutex. The.** g
18f60 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75  lobal mutex is u
18f70 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74  sed to protect t
18f80 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f  he winLockInfo o
18f90 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 0a  bjects used by .
18fa0 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
18fb0 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
18fc0 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
18fd0 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
18fe0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
18ff0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
19000 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
19010 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
19020 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
19030 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
19040 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
19050 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
19060 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
19070 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
19080 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
19090 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
190a0 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
190b0 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
190c0 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
190d0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
190e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
190f0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
19100 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
19110 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
19120 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
19130 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19140 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
19150 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
19160 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
19170 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
19180 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
19190 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
191a0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
191b0 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 6e 64 65  STER));.}.#ifnde
191c0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
191d0 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
191e0 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
191f0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
19200 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
19210 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
19220 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
19230 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
19240 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
19250 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
19260 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
19270 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
19280 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
19290 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
192a0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
192b0 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
192c0 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
192d0 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
192e0 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
192f0 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
19300 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
19310 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
19320 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
19330 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
19340 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19350 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
19360 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
19370 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
19380 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
19390 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
193a0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
193b0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
193c0 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
193d0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
193e0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
193f0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
19400 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
19410 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
19420 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pNext .**.** The
19430 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
19440 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
19450 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
19460 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
19470 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
19480 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
19490 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53  *.** Either winS
194a0 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
194b0 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e  t be held or win
194c0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
194d0 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  and.** winShmMut
194e0 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
194f0 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
19500 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
19510 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
19520 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
19530 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  *.*/.struct winS
19540 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74  hmNode {.  sqlit
19550 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
19560 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
19570 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
19580 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
19590 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
195a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
195b0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  the file */.  wi
195c0 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20  nFile hFile;    
195d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
195e0 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e   handle from win
195f0 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73  Open */..  int s
19600 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
19610 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19620 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
19630 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
19640 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
19650 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19660 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
19670 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d   */.  struct Shm
19680 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e  Region {.    HAN
19690 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
196a0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
196b0 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65  ndle from Create
196c0 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20  FileMapping */. 
196d0 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20     void *pMap;. 
196e0 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44   } *aRegion;.  D
196f0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
19700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19710 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
19720 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
19730 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74   error */..  int
19740 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
19750 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19760 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65  r of winShm obje
19770 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
19780 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
19790 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
197a0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53       /* All winS
197b0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
197c0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
197d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
197e0 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  xt;         /* N
197f0 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61  ext in list of a
19800 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
19810 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20  jects */.#ifdef 
19820 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
19830 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
19840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
19850 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53  t available winS
19860 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
19870 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
19880 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f  A global array o
19890 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
198a0 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20   objects..**.** 
198b0 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  The winShmMutexH
198c0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
198d0 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ue while reading
198e0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73   or writing this
198f0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
19900 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e   winShmNode *win
19910 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b  ShmNodeList = 0;
19920 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
19930 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
19940 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
19950 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
19960 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
19970 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
19980 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
19990 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
199a0 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
199b0 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
199c0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
199d0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
199e0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
199f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68  :.**.**    winSh
19a00 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20  m.pShmNode.**   
19a10 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a   winShm.id.**.**
19a20 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
19a30 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
19a40 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53  .  The winShm.pS
19a50 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75  hmNode->mutex mu
19a60 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
19a70 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
19a80 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
19a90 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  lds..*/.struct w
19aa0 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d  inShm {.  winShm
19ab0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
19ac0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
19ad0 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  rlying winShmNod
19ae0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69  e object */.  wi
19af0 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  nShm *pNext;    
19b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
19b10 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65   winShm with the
19b20 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65   same winShmNode
19b30 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
19b40 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
19b50 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
19b60 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  ing the winShmNo
19b70 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31  de mutex */.  u1
19b80 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
19b90 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
19ba0 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
19bb0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
19bc0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
19bd0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
19be0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
19bf0 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
19c00 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
19c10 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
19c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
19c30 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
19c40 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53  on with its winS
19c50 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
19c60 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
19c70 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
19c80 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
19c90 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20   WIN_SHM_BASE   
19ca0 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
19cb0 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
19cc0 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
19cd0 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  yte */.#define W
19ce0 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57  IN_SHM_DMS    (W
19cf0 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IN_SHM_BASE+SQLI
19d00 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
19d10 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
19d20 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
19d30 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
19d40 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20  for all n bytes 
19d50 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73  beginning at ofs
19d60 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53  t..*/.#define _S
19d70 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66  HM_UNLCK  1.#def
19d80 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20  ine _SHM_RDLCK  
19d90 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57  2.#define _SHM_W
19da0 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
19db0 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
19dc0 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
19dd0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
19de0 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
19df0 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
19e00 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
19e10 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
19e20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48  ,         /* _SH
19e30 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44  M_UNLCK, _SHM_RD
19e40 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c  LCK, or _SHM_WRL
19e50 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
19e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
19e70 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
19e80 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
19e90 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
19ea0 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
19eb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19ec0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
19ed0 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
19ee0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
19ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
19f00 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
19f10 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
19f20 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
19f30 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
19f40 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
19f50 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
19f60 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
19f70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19f80 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
19f90 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
19fa0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54  Ref==0 );..  OST
19fb0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
19fc0 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
19fd0 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
19fe0 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  e=%d\n",.       
19ff0 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65      pFile->hFile
1a000 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66  .h, lockType, of
1a010 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20  st, nByte));..  
1a020 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69  /* Release/Acqui
1a030 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  re the system-le
1a040 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  vel lock */.  if
1a050 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d  ( lockType==_SHM
1a060 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63  _UNLCK ){.    rc
1a070 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
1a080 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
1a090 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
1a0a0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1a0b0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1a0c0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
1a0d0 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44  ameters */.    D
1a0e0 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c  WORD dwFlags = L
1a0f0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
1a100 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66  EDIATELY;.    if
1a110 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53  ( lockType == _S
1a120 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61  HM_WRLCK ) dwFla
1a130 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45  gs |= LOCKFILE_E
1a140 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
1a150 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46     rc = winLockF
1a160 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c  ile(&pFile->hFil
1a170 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66  e.h, dwFlags, of
1a180 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
1a190 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72  ;.  }.  .  if( r
1a1a0 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
1a1b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1a1c0 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1a1d0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73  >lastErrno =  os
1a1e0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1a1f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a200 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  BUSY;.  }..  OST
1a210 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1a220 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73  file=%p, func=%s
1a230 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d  , errno=%lu, rc=
1a240 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1a250 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
1a260 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  , (lockType == _
1a270 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69  SHM_UNLCK) ? "wi
1a280 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20  nUnlockFile" :. 
1a290 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f            "winLo
1a2a0 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ckFile", pFile->
1a2b0 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74  lastErrno, sqlit
1a2c0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a2d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1a2e0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1a2f0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
1a300 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1a310 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
1a320 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
1a330 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
1a340 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
1a350 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
1a360 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
1a370 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
1a380 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
1a390 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
1a3a0 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
1a3b0 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
1a3c0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1a3d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1a3e0 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1a3f0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1a400 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1a410 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1a420 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1a430 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1a440 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1a450 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
1a460 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1a470 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
1a480 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
1a490 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1a4a0 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
1a4b0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
1a4c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1a4d0 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c  M-PURGE pid=%lu,
1a4e0 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e   deleteFlag=%d\n
1a4f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1a500 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1a510 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61  sId(), deleteFla
1a520 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  g));.  pp = &win
1a530 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
1a540 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
1a550 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
1a560 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1a570 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1a580 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73  f( p->mutex ){ s
1a590 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1a5a0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20  e(p->mutex); }. 
1a5b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1a5c0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1a5d0 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62  {.        BOOL b
1a5e0 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77  Rc = osUnmapView
1a5f0 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f  OfFile(p->aRegio
1a600 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20  n[i].pMap);.    
1a610 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1a620 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69  M-PURGE-UNMAP pi
1a630 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1a640 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1a660 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1a670 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
1a680 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1a690 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
1a6a0 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
1a6b0 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52  bRc);.        bR
1a6c0 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
1a6d0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1a6e0 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
1a6f0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1a700 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  GE-CLOSE pid=%lu
1a710 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1a720 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1a730 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1a740 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1a750 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1a760 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1a770 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1a780 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1a790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a7a0 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e  f( p->hFile.h!=N
1a7b0 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e  ULL && p->hFile.
1a7c0 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
1a7d0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
1a7e0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a7f0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1a800 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
1a810 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1a820 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
1a830 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1a840 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1a850 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
1a860 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
1a870 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1a880 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1a890 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1a8a0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
1a8b0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
1a8c0 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
1a8d0 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
1a8e0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
1a8f0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1a900 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1a910 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1a920 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1a930 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
1a940 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a950 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
1a960 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a970 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
1a980 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
1a990 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1a9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
1a9b0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1a9c0 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
1a9d0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69  with database fi
1a9e0 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20  le pDbFd..**.** 
1a9f0 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
1aa00 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
1aa10 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
1aa20 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
1aa30 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
1aa40 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
1aa50 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
1aa60 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
1aa70 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
1aa80 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
1aa90 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1aaa0 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
1aab0 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
1aac0 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
1aad0 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  int winOpenShare
1aae0 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20  dMemory(winFile 
1aaf0 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
1ab00 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20  t winShm *p;    
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab20 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1ab30 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1ab40 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
1ab50 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1ab60 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  0;   /* The unde
1ab70 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
1ab80 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
1ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1abb0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1abc0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1abd0 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
1abe0 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
1abf0 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65  cated winShmNode
1ac00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ac30 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74   of zName in byt
1ac40 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1ac50 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
1ac60 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
1ac70 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
1ac80 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
1ac90 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
1aca0 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
1acb0 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
1acc0 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
1acd0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
1ace0 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
1acf0 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
1ad00 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
1ad10 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1ad20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1ad30 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1ad40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1ad50 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  OMEM;.  nName = 
1ad60 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1ad70 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1ad80 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1ad90 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1ada0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1adb0 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1adc0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1add0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1ade0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1adf0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ae00 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46  ;.  }.  pNew->zF
1ae10 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
1ae20 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c  )&pNew[1];.  sql
1ae30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e  ite3_snprintf(nN
1ae40 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46  ame+15, pNew->zF
1ae50 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1ae60 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1ae70 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53  ;.  sqlite3FileS
1ae80 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
1ae90 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ath, pNew->zFile
1aea0 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f  name); ..  /* Lo
1aeb0 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ok to see if the
1aec0 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e  re is an existin
1aed0 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61  g winShmNode tha
1aee0 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20  t can be used.. 
1aef0 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69   ** If no matchi
1af00 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75  ng winShmNode cu
1af10 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20  rrently exists, 
1af20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
1af30 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45  ..  */.  winShmE
1af40 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
1af50 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69  or(pShmNode = wi
1af60 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53  nShmNodeList; pS
1af70 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65  hmNode; pShmNode
1af80 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74  =pShmNode->pNext
1af90 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65  ){.    /* TBD ne
1afa0 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69  ed to come up wi
1afb0 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20  th better match 
1afc0 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20  here.  Perhaps. 
1afd0 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49     ** use FILE_I
1afe0 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20  D_BOTH_DIR_INFO 
1aff0 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  Structure..    *
1b000 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
1b010 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64  3StrICmp(pShmNod
1b020 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  e->zFilename, pN
1b030 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d  ew->zFilename)==
1b040 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
1b050 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b   if( pShmNode ){
1b060 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1b070 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65  e(pNew);.  }else
1b080 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  {.    pShmNode =
1b090 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20   pNew;.    pNew 
1b0a0 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69  = 0;.    ((winFi
1b0b0 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e  le*)(&pShmNode->
1b0c0 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56  hFile))->h = INV
1b0d0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1b0e0 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  E;.    pShmNode-
1b0f0 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e  >pNext = winShmN
1b100 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e  odeList;.    win
1b110 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53  ShmNodeList = pS
1b120 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68  hmNode;..    pSh
1b130 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
1b140 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
1b150 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1b160 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70  FAST);.    if( p
1b170 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
1b180 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1b190 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1b1a0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
1b1b0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
1b1c0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   }..    rc = win
1b1d0 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73  Open(pDbFd->pVfs
1b1e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b1f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69     pShmNode->zFi
1b200 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  lename,         
1b210 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1b220 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
1b230 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1b240 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c      (sqlite3_fil
1b250 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  e*)&pShmNode->hF
1b260 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61  ile,  /* File ha
1b270 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20  ndle here */.   
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b290 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20  LITE_OPEN_WAL | 
1b2a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1b2b0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
1b2c0 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20  PEN_CREATE,.    
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
1b2e0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1b2f0 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
1b300 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1b310 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
1b320 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1b330 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
1b340 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1b350 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
1b360 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  .    ** If not, 
1b370 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
1b380 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
1b390 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
1b3a0 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
1b3b0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1b3c0 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_WRLCK, WIN_SHM
1b3d0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
1b3e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1b3f0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1b400 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1b410 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1b420 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1b430 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b440 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1b450 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1b460 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73  OERR_SHMOPEN, os
1b470 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65           "winOpe
1b4a0 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  nShm", pDbFd->zP
1b4b0 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
1b4c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1b4d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b4e0 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c     winShmSystemL
1b4f0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1b500 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
1b510 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
1b520 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1b530 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1b540 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e   _SHM_RDLCK, WIN
1b550 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1b560 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
1b570 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1b580 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rr;.  }..  /* Ma
1b590 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
1b5a0 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
1b5b0 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
1b5c0 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
1b5d0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
1b5e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1b5f0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1b600 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1b610 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1b620 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1b630 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1b640 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1b650 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
1b660 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1b670 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
1b680 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1b690 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
1b6a0 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
1b6b0 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72   the winShmEnter
1b6c0 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
1b6d0 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
1b6e0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
1b6f0 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20  (struct winShm) 
1b700 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
1b710 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
1b720 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
1b730 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
1b740 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
1b750 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
1b760 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1b770 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
1b780 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1b790 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
1b7a0 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
1b7b0 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
1b7c0 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
1b7d0 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
1b7e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1b7f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1b800 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
1b810 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
1b820 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
1b830 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
1b840 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1b850 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1b860 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b870 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
1b880 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
1b890 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
1b8a0 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  :.  winShmSystem
1b8b0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1b8c0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1b8d0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69  HM_DMS, 1);.  wi
1b8e0 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d  nShmPurge(pDbFd-
1b8f0 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20  >pVfs, 0);      
1b900 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65  /* This call fre
1b910 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72  es pShmNode if r
1b920 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c  equired */.  sql
1b930 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1b940 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1b950 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  w);.  winShmLeav
1b960 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1b970 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1b980 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
1b990 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1b9a0 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
1b9b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
1b9c0 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
1b9d0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
1b9e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1b9f0 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69  ShmUnmap(.  sqli
1ba00 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1ba10 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1ba20 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1ba30 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
1ba40 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
1ba50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65           /* Dele
1ba60 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67  te after closing
1ba70 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1ba80 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b   winFile *pDbFd;
1ba90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1baa0 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  se holding share
1bab0 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d-memory */.  wi
1bac0 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1bad0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
1bae0 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
1baf0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  ed */.  winShmNo
1bb00 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
1bb10 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1bb20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1bb30 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  le */.  winShm *
1bb40 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *pp;          /*
1bb50 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1bb60 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
1bb70 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46  tions */..  pDbF
1bb80 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1bb90 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
1bba0 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
1bbb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1bbc0 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
1bbd0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
1bbe0 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65   /* Remove conne
1bbf0 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65  ction p from the
1bc00 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69   set of connecti
1bc10 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ons associated. 
1bc20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64   ** with pShmNod
1bc30 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  e */.  sqlite3_m
1bc40 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
1bc50 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66  ode->mutex);.  f
1bc60 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d  or(pp=&pShmNode-
1bc70 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d  >pFirst; (*pp)!=
1bc80 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e  p; pp = &(*pp)->
1bc90 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d  pNext){}.  *pp =
1bca0 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a   p->pNext;..  /*
1bcb0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63   Free the connec
1bcc0 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69  tion p */.  sqli
1bcd0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
1bce0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a  DbFd->pShm = 0;.
1bcf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bd00 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1bd10 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  mutex);..  /* If
1bd20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20   pShmNode->nRef 
1bd30 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74  has reached 0, t
1bd40 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e  hen close the un
1bd50 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68  derlying.  ** sh
1bd60 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1bd70 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68  , too */.  winSh
1bd80 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
1bd90 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
1bda0 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  e->nRef>0 );.  p
1bdb0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b  ShmNode->nRef--;
1bdc0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1bdd0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1bde0 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46  winShmPurge(pDbF
1bdf0 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46  d->pVfs, deleteF
1be00 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53  lag);.  }.  winS
1be10 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1be20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1be30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
1be40 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
1be50 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
1be60 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
1be70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1be80 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  inShmLock(.  sql
1be90 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1bea0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1beb0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
1bec0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1bed0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
1bee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bef0 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
1bf00 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1bf10 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1bf20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1bf30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bf40 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
1bf50 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1bf60 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf80 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
1bf90 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
1bfa0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1bfb0 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1bfc0 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  d;        /* Con
1bfd0 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
1bfe0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1bff0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
1c000 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
1c010 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c020 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
1c030 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
1c040 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  winShm *pX;     
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1c070 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
1c080 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53  blings */.  winS
1c090 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
1c0a0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
1c0b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1c0c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1c0d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1c0e0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  t code */.  u16 
1c0f0 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  mask;           
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63    /* Mask of loc
1c120 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65  ks to take or re
1c130 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  lease */..  asse
1c140 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f  rt( ofst>=0 && o
1c150 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48  fst+n<=SQLITE_SH
1c160 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  M_NLOCK );.  ass
1c170 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61  ert( n>=1 );.  a
1c180 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53  ssert( flags==(S
1c190 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1c1a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1c1b0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1c1c0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1c1d0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1c1e0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20  HM_EXCLUSIVE).  
1c1f0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1c200 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1c210 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1c220 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1c230 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1c240 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1c250 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1c260 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  E) );.  assert( 
1c270 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26  n==1 || (flags &
1c280 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1c290 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20  USIVE)!=0 );..  
1c2a0 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55  mask = (u16)((1U
1c2b0 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
1c2c0 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73  U<<ofst));.  ass
1c2d0 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
1c2e0 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
1c2f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c300 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1c310 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
1c320 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1c330 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
1c340 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
1c350 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1c360 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
1c370 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
1c380 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
1c390 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
1c3a0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
1c3b0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
1c3c0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1c3d0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1c3e0 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
1c3f0 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
1c400 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
1c410 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
1c420 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
1c430 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
1c440 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
1c450 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
1c460 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
1c470 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
1c480 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
1c490 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
1c4a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1c4b0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1c4c0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
1c4d0 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48  LCK, ofst+WIN_SH
1c4e0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
1c4f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c500 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1c510 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
1c520 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
1c530 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1c540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c550 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
1c560 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
1c570 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
1c580 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
1c590 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
1c5a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1c5b0 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
1c5c0 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
1c5d0 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
1c5e0 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
1c5f0 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
1c600 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
1c610 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
1c620 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
1c630 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
1c640 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1c650 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
1c660 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
1c670 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
1c680 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
1c690 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
1c6a0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
1c6b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1c6c0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1c6d0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1c6e0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1c6f0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1c700 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
1c710 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c720 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1c730 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c740 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
1c750 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
1c760 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c770 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
1c780 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
1c790 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
1c7a0 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
1c7b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c7c0 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
1c7d0 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
1c7e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c7f0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1c800 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1c810 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  RDLCK, ofst+WIN_
1c820 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1c830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c840 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c850 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
1c860 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
1c870 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
1c880 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
1c890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c8a0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1c8b0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1c8c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1c8d0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
1c8e0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1c8f0 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
1c900 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
1c910 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
1c920 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
1c930 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
1c940 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
1c950 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1c960 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1c970 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1c980 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1c990 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1c9a0 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
1c9b0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
1c9c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1c9d0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1c9e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ca00 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
1ca10 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
1ca20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
1ca30 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
1ca40 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
1ca50 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
1ca60 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
1ca70 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
1ca80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
1ca90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1caa0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1cab0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1cac0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
1cad0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1cae0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69  ASE, n);.      i
1caf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cb00 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1cb10 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61  rt( (p->sharedMa
1cb20 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b  sk & mask)==0 );
1cb30 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  .        p->excl
1cb40 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1cb50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cb60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cb70 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
1cb80 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43  mutex);.  OSTRAC
1cb90 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64  E(("SHM-LOCK pid
1cba0 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61  =%lu, id=%d, sha
1cbb0 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78  redMask=%03x, ex
1cbc0 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d  clMask=%03x, rc=
1cbd0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1cbe0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1cbf0 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64  ocessId(), p->id
1cc00 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
1cc10 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
1cc20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cc30 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1cc40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cc50 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61  *.** Implement a
1cc60 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
1cc70 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20  or memory fence 
1cc80 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1cc90 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f  .  .**.** All lo
1cca0 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62  ads and stores b
1ccb0 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20  egun before the 
1ccc0 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d  barrier must com
1ccd0 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20  plete before.** 
1cce0 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72  any load or stor
1ccf0 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68  e begun after th
1cd00 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74  e barrier..*/.st
1cd10 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1cd20 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
1cd30 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
1cd40 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1cd50 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1cd60 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
1cd70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1cd80 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65  TER(fd);.  /* Me
1cd90 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f  moryBarrier(); /
1cda0 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  / does not work 
1cdb0 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77  -- do not know w
1cdc0 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53  hy not */.  winS
1cdd0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
1cde0 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1cdf0 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ex();.}../*.** T
1ce00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ce10 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
1ce20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
1ce30 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
1ce40 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
1ce50 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1ce60 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1ce70 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
1ce80 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1ce90 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
1cea0 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
1ceb0 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
1cec0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1ced0 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
1cee0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1cef0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1cf00 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1cf10 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1cf20 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
1cf30 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1cf40 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1cf50 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61  the isWrite para
1cf60 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
1cf70 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1cf80 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
1cf90 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
1cfa0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
1cfb0 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
1cfc0 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
1cfd0 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
1cfe0 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
1cff0 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
1d000 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1d010 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
1d020 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e  .** isWrite is n
1d030 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
1d040 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
1d050 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
1d060 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
1d070 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1d080 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
1d090 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1d0a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
1d0b0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1d0c0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1d0d0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
1d0e0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
1d0f0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
1d100 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1d110 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
1d120 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
1d130 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
1d140 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
1d150 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
1d160 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
1d170 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
1d180 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
1d190 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1d1a0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1d1b0 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a   int winShmMap(.
1d1c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1d1d0 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1d1e0 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
1d1f0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
1d200 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
1d210 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1d220 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
1d230 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
1d240 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
1d270 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ions */.  int is
1d280 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
1d290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d2a0 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
1d2b0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1d2c0 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
1d2d0 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
1d2e0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
1d2f0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1d300 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
1d310 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a  = (winFile*)fd;.
1d320 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
1d330 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e  bFd->pShm;.  win
1d340 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1d350 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1d360 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
1d370 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  !p ){.    rc = w
1d380 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1d390 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
1d3a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d3b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d3c0 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1d3d0 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64  m;.  }.  pShmNod
1d3e0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1d3f0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
1d400 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1d410 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1d420 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
1d430 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1d440 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
1d450 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69  egion==0 );..  i
1d460 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1d470 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1d480 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52  .    struct ShmR
1d490 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20  egion *apNew;   
1d4a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
1d4b0 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
1d4c0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
1d4d0 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
1d4e0 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
1d4f0 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
1d500 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  e size */.    sq
1d510 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20  lite3_int64 sz; 
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d530 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
1d540 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69   of wal-index fi
1d550 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  le */..    pShmN
1d560 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
1d570 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f  szRegion;..    /
1d580 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1d590 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
1d5a0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1d5b0 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
1d5c0 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43   space..    ** C
1d5d0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
1d5e0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
1d5f0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
1d600 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
1d610 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65   is.    ** large
1d620 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
1d630 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1d640 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f   region)..    */
1d650 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1d660 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1d670 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1d680 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20  >hFile, &sz);.  
1d690 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d6a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1d6b0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1d6c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1d6d0 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1d6e0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1d700 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64  nShmMap1", pDbFd
1d710 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1d720 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1d730 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1d740 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20   sz<nByte ){.   
1d750 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1d760 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1d770 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
1d780 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20  . If isWrite is 
1d790 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  set to.      ** 
1d7a0 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79  zero, exit early
1d7b0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
1d7c0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1d7d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1d7e0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d7f0 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
1d800 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73  y, if isWrite is
1d810 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66   non-zero, use f
1d820 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c  truncate() to al
1d830 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  locate.      ** 
1d840 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1d850 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20  mory region..   
1d860 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d870 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20  !isWrite ) goto 
1d880 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1d890 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
1d8a0 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
1d8b0 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
1d8c0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1d8d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d8e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d8f0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1d900 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1d910 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
1d920 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c     "winShmMap2",
1d950 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1d960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1d970 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1d980 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d990 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
1d9a0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1d9b0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1d9c0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1d9d0 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
1d9e0 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67  = (struct ShmReg
1d9f0 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65  ion *)sqlite3_re
1da00 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
1da10 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1da20 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
1da30 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20  zeof(apNew[0]). 
1da40 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
1da50 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
1da60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1da70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1da80 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1da90 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
1daa0 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e  e->aRegion = apN
1dab0 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  ew;..    while( 
1dac0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1dad0 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
1dae0 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 20      HANDLE hMap 
1daf0 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
1db00 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20  /* file-mapping 
1db10 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
1db20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20  void *pMap = 0; 
1db30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1db40 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  apped memory reg
1db50 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23 69 66  ion */.     .#if
1db60 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1db70 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1db80 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1db90 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64  gFromApp(pShmNod
1dba0 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
1dbb0 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
1dbc0 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74  _READWRITE, nByt
1dbd0 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
1dbe0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1dbf0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1dc00 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70  WIDE).      hMap
1dc10 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1dc20 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65  appingW(pShmNode
1dc30 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20  ->hFile.h, .    
1dc40 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45        NULL, PAGE
1dc50 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e  _READWRITE, 0, n
1dc60 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20  Byte, NULL.     
1dc70 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1dc80 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1dc90 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20 20 68  AS_ANSI).      h
1dca0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1dcb0 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d 4e  leMappingA(pShmN
1dcc0 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20  ode->hFile.h, . 
1dcd0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1dce0 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1dcf0 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1dd00 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20      );.#endif.  
1dd10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1dd20 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69 64  M-MAP-CREATE pid
1dd30 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1dd40 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1dd50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1dd60 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1dd70 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d  rocessId(), pShm
1dd80 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e  Node->nRegion, n
1dd90 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Byte,.          
1dda0 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22       hMap ? "ok"
1ddb0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1ddc0 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 7b       if( hMap ){
1ddd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
1dde0 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  fset = pShmNode-
1ddf0 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  >nRegion*szRegio
1de00 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  n;.        int i
1de10 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
1de20 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
1de30 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1de40 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66 20  ranularity;.#if 
1de50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1de60 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
1de70 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
1de80 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c 45  omApp(hMap, FILE
1de90 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c  _MAP_WRITE | FIL
1dea0 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20  E_MAP_READ,.    
1deb0 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74 20          iOffset 
1dec0 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
1ded0 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
1dee0 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
1def0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20  );.#else.       
1df00 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1df10 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46 49  wOfFile(hMap, FI
1df20 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46  LE_MAP_WRITE | F
1df30 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20  ILE_MAP_READ,.  
1df40 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f 66            0, iOf
1df50 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1df60 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1df70 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1df80 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
1df90 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1dfa0 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69 64  "SHM-MAP-MAP pid
1dfb0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1dfc0 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65   offset=%d, size
1dfd0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e000 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
1e010 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66  e->nRegion, iOff
1e020 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
1e030 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20        szRegion, 
1e040 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  pMap ? "ok" : "f
1e050 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1e060 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61  }.      if( !pMa
1e070 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  p ){.        pSh
1e080 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1e090 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1e0a0 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r();.        rc 
1e0b0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1e0c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
1e0d0 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73  P, pShmNode->las
1e0e0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70   "winShmMap3", p
1e110 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1e120 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1e130 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
1e140 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
1e150 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1e160 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1e170 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1e180 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1e190 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
1e1a0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1e1b0 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1e1c0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
1e1d0 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
1e1e0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1e1f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
1e200 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
1e210 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1e220 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
1e230 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1e240 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
1e250 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
1e260 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1e270 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1e280 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1e290 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
1e2a0 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
1e2b0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1e2c0 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
1e2d0 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
1e2e0 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
1e2f0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
1e300 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  *pp = 0;.  }.  s
1e310 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e320 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1e330 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1e340 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
1e350 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20  ine winShmMap   
1e360 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
1e370 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
1e380 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72  efine winShmBarr
1e390 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77  ier 0.# define w
1e3a0 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  inShmUnmap   0.#
1e3b0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
1e3c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1e3d0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e   */../*.** Clean
1e3e0 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64 20  s up the mapped 
1e3f0 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70  region of the sp
1e400 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66  ecified file, if
1e410 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   any..*/.#if SQL
1e420 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e430 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 77  E>0.static int w
1e440 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46  inUnmapfile(winF
1e450 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61  ile *pFile){.  a
1e460 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
1e470 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
1e480 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1e490 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
1e4a0 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  p=%p, pMapRegion
1e4b0 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
1e4c0 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64    "mmapSize=%lld
1e4d0 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  , mmapSizeActual
1e4e0 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d  =%lld, mmapSizeM
1e4f0 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20  ax=%lld\n",.    
1e500 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1e510 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1e520 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d  pFile, pFile->hM
1e530 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ap, pFile->pMapR
1e540 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  egion,.         
1e550 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1e560 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  e, pFile->mmapSi
1e570 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d  zeActual, pFile-
1e580 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a  >mmapSizeMax));.
1e590 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61    if( pFile->pMa
1e5a0 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  pRegion ){.    i
1e5b0 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f  f( !osUnmapViewO
1e5c0 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61  fFile(pFile->pMa
1e5d0 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20  pRegion) ){.    
1e5e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1e5f0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1e600 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
1e610 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1e620 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1e630 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d  =%p, pMapRegion=
1e640 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %p, ".          
1e650 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f       "rc=SQLITE_
1e660 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f  IOERR_MMAP\n", o
1e670 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1e680 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
1e6a0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1e6b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e6c0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1e6d0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1e6e0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
1e6f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e700 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
1e710 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65  mapfile1", pFile
1e720 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1e730 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
1e740 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
1e750 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1e760 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1e770 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
1e780 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  0;.  }.  if( pFi
1e790 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29  le->hMap!=NULL )
1e7a0 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f  {.    if( !osClo
1e7b0 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
1e7c0 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70  hMap) ){.      p
1e7d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1e7e0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1e7f0 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ();.      OSTRAC
1e800 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1e810 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1e820 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51  , hMap=%p, rc=SQ
1e830 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1e840 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e850 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1e860 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1e870 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29  e, pFile->hMap))
1e880 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
1e890 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1e8a0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1e8b0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d           "winUnm
1e8e0 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d  apfile2", pFile-
1e8f0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
1e900 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d     pFile->hMap =
1e910 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54   NULL;.  }.  OST
1e920 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1e930 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1e940 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1e950 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1e960 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1e970 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 29  cessId(), pFile)
1e980 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1e990 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e9a0 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65  Memory map or re
1e9b0 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65  map the file ope
1e9c0 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63  ned by file-desc
1e9d0 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74  riptor pFd (if t
1e9e0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c  he file.** is al
1e9f0 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68  ready mapped, th
1ea00 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
1ea10 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  ng is replaced b
1ea20 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20  y the new). Or, 
1ea30 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72  if .** there alr
1ea40 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61  eady exists a ma
1ea50 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66  pping for this f
1ea60 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ile, and there a
1ea70 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74  re still .** out
1ea80 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28  standing xFetch(
1ea90 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  ) references to 
1eaa0 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  it, this functio
1eab0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
1eac0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1ead0 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65   nByte is non-ne
1eae0 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20  gative, then it 
1eaf0 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  is the requested
1eb00 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65   size of .** the
1eb10 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61   mapping to crea
1eb20 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  te. Otherwise, i
1eb30 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20  f nByte is less 
1eb40 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1eb50 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
1eb60 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69  d size is the si
1eb70 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
1eb80 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75  n disk. The actu
1eb90 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  al size of the.*
1eba0 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e  * created mappin
1ebb0 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  g is either the 
1ebc0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
1ebd0 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66  r the value conf
1ebe0 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67  igured .** using
1ebf0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
1ec00 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76  AP_SIZE, whichev
1ec10 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
1ec20 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1ec30 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
1ec40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
1ec50 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
1ec60 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
1ec70 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
1ec80 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
1ec90 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
1eca0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ecb0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
1ecc0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1ecd0 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
1ece0 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  File *pFd, sqlit
1ecf0 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
1ed00 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1ed10 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
1ed20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ed30 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
1ed40 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
1ed50 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1ed60 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1ed70 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65  , pFile=%p, size
1ed80 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
1ed90 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1eda0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1edb0 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69  d, nByte));..  i
1edc0 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
1edd0 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
1ede0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
1edf0 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  Map<0 ){.    rc 
1ee00 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
1ee10 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64  qlite3_file*)pFd
1ee20 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66  , &nMap);.    if
1ee30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53  ( rc ){.      OS
1ee40 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1ee50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1ee60 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1ee70 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20  ERR_FSTAT\n",.  
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1ee90 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1eea0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20  Id(), pFd));.   
1eeb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1eec0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1eed0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d    }.  }.  if( nM
1eee0 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
1eef0 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
1ef00 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
1ef10 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26  ax;.  }.  nMap &
1ef20 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ~(sqlite3_int6
1ef30 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  4)(winSysInfo.dw
1ef40 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  PageSize - 1);. 
1ef50 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26  .  if( nMap==0 &
1ef60 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e  & pFd->mmapSize>
1ef70 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61  0 ){.    winUnma
1ef80 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a  pfile(pFd);.  }.
1ef90 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d    if( nMap!=pFd-
1efa0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1efb0 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b   void *pNew = 0;
1efc0 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65  .    DWORD prote
1efd0 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e  ct = PAGE_READON
1efe0 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c  LY;.    DWORD fl
1eff0 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52  ags = FILE_MAP_R
1f000 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d  EAD;..    winUnm
1f010 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20  apfile(pFd);.   
1f020 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
1f030 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52  lags & WINFILE_R
1f040 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
1f050 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47     protect = PAG
1f060 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  E_READWRITE;.   
1f070 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45     flags |= FILE
1f080 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20  _MAP_WRITE;.    
1f090 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  }.#if SQLITE_OS_
1f0a0 57 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68  WINRT.    pFd->h
1f0b0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1f0c0 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
1f0d0 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
1f0e0 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55  rotect, nMap, NU
1f0f0 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
1f100 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1f110 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46  HAS_WIDE).    pF
1f120 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
1f130 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1f140 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
1f150 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
1f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f170 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
1f180 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
1f190 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1b0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1f1c0 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
1f1d0 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66  f), NULL);.#elif
1f1e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1f1f0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
1f200 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
1f210 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1f220 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  ingA(pFd->h, NUL
1f230 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20  L, protect,.    
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f250 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
1f260 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26  RD)((nMap>>32) &
1f270 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20   0xffffffff),.  
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
1f2a0 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66  WORD)(nMap & 0xf
1f2b0 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b  fffffff), NULL);
1f2c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1f2d0 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20  pFd->hMap==NULL 
1f2e0 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61  ){.      pFd->la
1f2f0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1f300 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1f310 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1f320 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1f330 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
1f340 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1f360 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d  nMapfile1", pFd-
1f370 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
1f380 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
1f390 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
1f3a0 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
1f3b0 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
1f3c0 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
1f3d0 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52  CE(("MAP-FILE-CR
1f3e0 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  EATE pid=%lu, pF
1f3f0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1f400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f410 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f420 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73  cessId(), pFd, s
1f430 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1f440 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
1f450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f460 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28   }.    assert( (
1f470 6e 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66  nMap % winSysInf
1f480 6f 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30  o.dwPageSize)==0
1f490 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f4a0 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d  sizeof(SIZE_T)==
1f4b0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69  sizeof(sqlite3_i
1f4c0 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30  nt64) || nMap<=0
1f4d0 78 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66  xffffffff );.#if
1f4e0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1f4f0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
1f500 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
1f510 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c  pp(pFd->hMap, fl
1f520 61 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29  ags, 0, (SIZE_T)
1f530 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20  nMap);.#else.   
1f540 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65   pNew = osMapVie
1f550 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61  wOfFile(pFd->hMa
1f560 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20  p, flags, 0, 0, 
1f570 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23  (SIZE_T)nMap);.#
1f580 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e  endif.    if( pN
1f590 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ew==NULL ){.    
1f5a0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
1f5b0 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20  pFd->hMap);.    
1f5c0 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55    pFd->hMap = NU
1f5d0 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c  LL;.      pFd->l
1f5e0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1f5f0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1f600 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1f610 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1f620 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74  _MMAP, pFd->last
1f630 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1f650 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64  inMapfile2", pFd
1f660 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1f670 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72  /* Log the error
1f680 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e  , but continue n
1f690 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20  ormal operation 
1f6a0 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
1f6b0 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52  te */.      OSTR
1f6c0 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d  ACE(("MAP-FILE-M
1f6d0 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AP pid=%lu, pFil
1f6e0 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%p, rc=%s\n",.
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1f700 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1f710 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c  ssId(), pFd, sql
1f720 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1f730 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f750 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65  .    pFd->pMapRe
1f760 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20  gion = pNew;.   
1f770 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
1f780 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e   nMap;.    pFd->
1f790 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
1f7a0 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53   nMap;.  }..  OS
1f7b0 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1f7c0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1f7d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1f7e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f7f0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f800 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a  essId(), pFd));.
1f810 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f820 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
1f830 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1f840 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SIZE>0 */../*.**
1f850 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
1f860 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1f870 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
1f880 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
1f890 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
1f8a0 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
1f8b0 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
1f8c0 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
1f8d0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
1f8e0 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
1f8f0 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
1f900 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
1f910 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1f920 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
1f930 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
1f940 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1f950 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
1f960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f970 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
1f980 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
1f990 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
1f9a0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1f9b0 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
1f9c0 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
1f9d0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
1f9e0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
1f9f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1fa00 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
1fa10 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
1fa20 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
1fa30 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
1fa40 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
1fa50 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68  lling winUnfetch
1fa60 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1fa70 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74  t winFetch(sqlit
1fa80 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
1fa90 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
1faa0 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
1fab0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1fac0 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c  _SIZE>0.  winFil
1fad0 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c  e *pFd = (winFil
1fae0 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20  e*)fd;   /* The 
1faf0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
1fb00 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  ase file */.#end
1fb10 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20  if.  *pp = 0;.. 
1fb20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
1fb30 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1fb40 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c  %p, offset=%lld,
1fb50 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25   amount=%d, pp=%
1fb60 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
1fb70 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1fb80 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f  cessId(), fd, iO
1fb90 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a  ff, nAmt, pp));.
1fba0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1fbb0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
1fbc0 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  ( pFd->mmapSizeM
1fbd0 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ax>0 ){.    if( 
1fbe0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
1fbf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1fc00 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28  rc = winMapfile(
1fc10 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
1fc20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fc30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54  K ){.        OST
1fc40 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64  RACE(("FETCH pid
1fc50 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1fc60 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1fc70 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1fc80 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1fc90 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
1fca0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1fcb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1fcc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fcd0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61      if( pFd->mma
1fce0 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41  pSize >= iOff+nA
1fcf0 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20  mt ){.      *pp 
1fd00 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  = &((u8 *)pFd->p
1fd10 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
1fd20 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65  ;.      pFd->nFe
1fd30 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a  tchOut++;.    }.
1fd40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53    }.#endif..  OS
1fd50 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
1fd60 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1fd70 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20   pp=%p, *pp=%p, 
1fd80 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1fd90 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1fda0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1fdb0 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70  d(), fd, pp, *pp
1fdc0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1fdd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1fde0 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72   If the third ar
1fdf0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55  gument is non-NU
1fe00 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
1fe10 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20  nction releases 
1fe20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  a .** reference 
1fe30 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65  obtained by an e
1fe40 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 77  arlier call to w
1fe50 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  inFetch(). The s
1fe60 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
1fe70 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1fe80 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
1fe90 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1fea0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
1feb0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
1fec0 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
1fed0 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69 6e  he winFetch() in
1fee0 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
1fef0 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
1ff00 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
1ff10 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
1ff20 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
1ff30 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
1ff40 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
1ff50 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
1ff60 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
1ff70 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
1ff80 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
1ff90 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
1ffa0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
1ffb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1ffc0 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65  inUnfetch(sqlite
1ffd0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
1ffe0 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  iOff, void *p){.
1fff0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
20000 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
20010 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
20020 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
20030 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
20040 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
20050 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
20060 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
20070 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
20080 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
20090 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65  anding .  ** xFe
200a0 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
200b0 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
200c0 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
200d0 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
200e0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
200f0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
20100 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
20110 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
20120 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
20130 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
20140 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
20150 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
20160 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
20170 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
20180 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
20190 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
201a0 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
201b0 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
201c0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
201d0 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
201e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
201f0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20200 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
20210 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
20220 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
20230 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
20240 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
20250 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
20260 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
20270 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
20280 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
20290 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
202a0 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
202b0 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
202c0 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
202d0 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
202e0 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
202f0 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  an can be omitte
20300 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  d - potentially 
20310 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a  improving.    **
20320 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a   performance.  *
20330 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  /.    winUnmapfi
20340 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
20350 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
20360 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e  tchOut>=0 );.#en
20370 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
20380 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
20390 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
203a0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
203b0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
203c0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
203d0 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   fd));.  return 
203e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
203f0 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
20400 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
20410 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
20420 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
20430 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20440 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
20450 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
20460 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
20470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20480 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
20490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
204a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
204b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
204c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
204d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
204e0 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
204f0 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
20500 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
20510 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
20520 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
20530 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
20540 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
20550 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
20560 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20580 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
20590 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205b0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
205c0 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
205d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205e0 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
205f0 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
20600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20610 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
20620 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
20650 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
20680 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
20690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206a0 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
206b0 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
206e0 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
206f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20700 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
20710 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
20720 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
20730 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
20740 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
20750 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
20760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
20770 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
20780 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
207b0 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
207c0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
207d0 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
207e0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
207f0 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
20820 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
20850 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
20860 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
20870 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
20880 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
20890 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
208a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
208b0 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
208c0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
208d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
208e0 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
208f0 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
20900 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
20910 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  etch */.};../***
20920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20960 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
20970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20980 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
20990 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
209a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
209c0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
209d0 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
209e0 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
209f0 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
20a00 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
20a10 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
20a20 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a  (__CYGWIN__)./*.
20a30 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c  ** Convert a fil
20a40 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65  ename from whate
20a50 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ver the underlyi
20a60 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ng operating sys
20a70 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  tem.** supports 
20a80 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  for filenames in
20a90 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65  to UTF-8.  Space
20aa0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
20ab0 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ult is.** obtain
20ac0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
20ad0 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
20ae0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
20af0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
20b00 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e  tic char *winCon
20b10 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
20b20 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  me(const void *z
20b30 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
20b40 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  r *zConverted = 
20b50 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  0;.  if( osIsNT(
20b60 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
20b70 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  ted = winUnicode
20b80 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65  ToUtf8(zFilename
20b90 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
20ba0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
20bb0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
20bc0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
20bd0 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
20be0 74 6f 5f 75 74 66 38 28 7a 46 69 6c 65 6e 61 6d  to_utf8(zFilenam
20bf0 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
20c00 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
20c10 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
20c20 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
20c30 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23   zConverted;.}.#
20c40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
20c50 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
20c60 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
20c70 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
20c80 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
20c90 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
20ca0 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
20cb0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
20cc0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
20cd0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
20ce0 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
20cf0 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
20d00 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
20d10 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
20d20 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f  d *winConvertFro
20d30 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  mUtf8Filename(co
20d40 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
20d50 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
20d60 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
20d70 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
20d80 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
20d90 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
20da0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
20db0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
20dc0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
20dd0 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
20de0 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
20df0 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
20e00 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  cs(zFilename);. 
20e10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
20e20 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
20e30 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
20e40 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
20e50 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  verted;.}../*.**
20e60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
20e70 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
20e80 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
20e90 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75   UTF-8 string bu
20ea0 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74  ffer.** ends wit
20eb0 68 20 61 20 64 69 72 65 63 74 6f 72 79 20 73 65  h a directory se
20ec0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
20ed0 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63  r or one was suc
20ee0 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64  cessfully.** add
20ef0 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61  ed to it..*/.sta
20f00 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45  tic int winMakeE
20f10 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e  ndInDirSep(int n
20f20 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
20f30 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a  {.  if( zBuf ){.
20f40 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73      int nLen = s
20f50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
20f60 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  Buf);.    if( nL
20f70 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  en>0 ){.      if
20f80 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42  ( winIsDirSep(zB
20f90 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20  uf[nLen-1]) ){. 
20fa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
20fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20fc0 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a   nLen+1<nBuf ){.
20fd0 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65          zBuf[nLe
20fe0 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65  n] = winGetDirSe
20ff0 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75  p();.        zBu
21000 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27  f[nLen+1] = '\0'
21010 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21020 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
21030 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
21040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21050 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
21060 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72  le name and stor
21070 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  e the resulting 
21080 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42  pointer into pzB
21090 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  uf..** The point
210a0 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70  er returned in p
210b0 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66 72 65  zBuf must be fre
210c0 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66  ed via sqlite3_f
210d0 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
210e0 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e   int winGetTempn
210f0 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ame(sqlite3_vfs 
21100 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a  *pVfs, char **pz
21110 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
21120 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
21130 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
21140 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
21150 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
21160 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
21170 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
21180 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a  ";.  size_t i, j
21190 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73  ;.  int nPre = s
211a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53  qlite3Strlen30(S
211b0 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
211c0 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e  PREFIX);.  int n
211d0 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c  Max, nBuf, nDir,
211e0 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   nLen;.  char *z
211f0 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  Buf;..  /* It's 
21200 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
21210 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
21220 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
21230 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
21240 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
21250 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
21260 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
21270 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
21280 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
21290 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20  failing. .  */. 
212a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
212b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
212c0 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41  IOERR );..  /* A
212d0 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72  llocate a tempor
212e0 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 73 74  ary buffer to st
212f0 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75  ore the fully qu
21300 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a  alified file.  *
21310 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74  * name for the t
21320 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
21330 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77  If this fails, w
21340 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75  e cannot continu
21350 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d  e..  */.  nMax =
21360 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
21370 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b  e; nBuf = nMax +
21380 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c   2;.  zBuf = sql
21390 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
213a0 6e 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a  nBuf );.  if( !z
213b0 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  Buf ){.    OSTRA
213c0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
213d0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
213e0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
213f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21400 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
21410 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
21420 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
21430 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
21440 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68  tory.  First, ch
21450 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  eck if one.  ** 
21460 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69  has been explici
21470 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61  tly set by the a
21480 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65  pplication; othe
21490 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f  rwise, use the o
214a0 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  ne.  ** configur
214b0 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74  ed by the operat
214c0 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ing system..  */
214d0 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d  .  nDir = nMax -
214e0 20 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20   (nPre + 15);.  
214f0 61 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29  assert( nDir>0 )
21500 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
21510 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
21520 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65  {.    int nDirLe
21530 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
21540 6e 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  n30(sqlite3_temp
21550 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
21560 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29   if( nDirLen>0 )
21570 7b 0a 20 20 20 20 20 20 69 66 28 20 21 77 69 6e  {.      if( !win
21580 49 73 44 69 72 53 65 70 28 73 71 6c 69 74 65 33  IsDirSep(sqlite3
21590 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b  _temp_directory[
215a0 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20  nDirLen-1]) ){. 
215b0 20 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b         nDirLen++
215c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
215d0 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72  if( nDirLen>nDir
215e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
215f0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
21600 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
21610 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
21620 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
21630 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  n"));.        re
21640 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
21650 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
21660 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
21670 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e1", 0);.      }
21680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
21690 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
216a0 75 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  uf, "%s", sqlite
216b0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
216c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  );.    }.  }.#if
216d0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
216e0 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20  N__).  else{.   
216f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
21700 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
21710 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
21720 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
21730 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  DIR") */.       
21740 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d  0, /* getenv("TM
21750 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
21760 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
21770 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
21780 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d  , /* getenv("TEM
21790 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  P") */.       0,
217a0 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52   /* getenv("USER
217b0 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20  PROFILE") */.   
217c0 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
217d0 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70         "/usr/tmp
217e0 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22  ",.       "/tmp"
217f0 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20  ,.       ".",.  
21800 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
21810 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
21820 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
21830 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
21840 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
21850 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Dir = 0;..    if
21860 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
21870 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
21880 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
21890 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
218a0 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
218b0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
218c0 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
218d0 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69  azDirs[2] ) azDi
218e0 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[2] = getenv("
218f0 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21  TMP");.    if( !
21900 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69  azDirs[3] ) azDi
21910 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[3] = getenv("
21920 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  TEMP");.    if( 
21930 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44  !azDirs[4] ) azD
21940 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28  irs[4] = getenv(
21950 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a  "USERPROFILE");.
21960 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
21970 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
21980 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
21990 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
219a0 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  ]){.      void *
219b0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
219c0 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
219d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
219e0 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73  /* If the path s
219f0 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
21a00 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77  ve letter follow
21a10 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a  ed by the colon.
21a20 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74        ** charact
21a30 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73  er, assume it is
21a40 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76   already a nativ
21a50 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74  e Win32 path; ot
21a60 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
21a70 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e  * it must be con
21a80 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69  verted to a nati
21a90 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 76 69  ve Win32 path vi
21aa0 61 20 74 68 65 20 43 79 67 77 69 6e 20 41 50 49  a the Cygwin API
21ab0 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20  .      ** prior 
21ac0 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20  to using it..   
21ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
21ae0 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
21af0 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29  AndColon(zDir) )
21b00 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65  {.        zConve
21b10 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
21b20 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
21b30 65 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  e(zDir);.       
21b40 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64   if( !zConverted
21b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21b60 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
21b70 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52  ;.          OSTR
21b80 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
21b90 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
21ba0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
21bb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
21bc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
21bd0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
21be0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73         if( winIs
21bf0 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
21c00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21c10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
21c20 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
21c30 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20  zDir);.         
21c40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
21c50 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
21c60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21c70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
21c80 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
21c90 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65  erted);.      }e
21ca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
21cb0 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
21cc0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
21cd0 78 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  x+1 );.        i
21ce0 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29  f( !zConverted )
21cf0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21d00 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
21d10 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
21d20 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
21d30 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
21d40 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
21d50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
21d60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
21d70 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
21d80 20 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f       if( cygwin_
21d90 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
21da0 20 20 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e             osIsN
21db0 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f  T() ? CCP_POSIX_
21dc0 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50  TO_WIN_W : CCP_P
21dd0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a  OSIX_TO_WIN_A, z
21de0 44 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Dir,.           
21df0 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c       zConverted,
21e00 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20   nMax+1)<0 ){.  
21e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21e20 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
21e30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21e40 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
21e50 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
21e60 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
21e70 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
21e80 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b  R_CONVPATH\n"));
21e90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21ea0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
21eb0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
21ec0 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
21ed0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
21f00 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
21f10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
21f20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
21f30 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
21f40 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
21f50 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20  nt, we know the 
21f60 63 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74  candidate direct
21f70 6f 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73  ory exists and s
21f80 68 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20  hould.          
21f90 2a 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77  ** be used.  How
21fa0 65 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65  ever, we may nee
21fb0 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65  d to convert the
21fc0 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
21fd0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
21fe0 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54  its name into UT
21ff0 46 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20  F-8 (i.e. if it 
22000 69 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20  is UTF-16 right 
22010 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20  now)..          
22020 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  */.          cha
22030 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
22040 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
22050 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ame(zConverted);
22060 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
22070 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
22080 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22090 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
220a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
220b0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
220c0 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
220d0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
220e0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
220f0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22100 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
22110 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
22120 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
22130 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
22140 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
22150 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
22160 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20  Utf8);.         
22170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
22180 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tf8);.          
22190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
221a0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
221b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
221c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
221d0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
221e0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rted);.      }. 
221f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21     }.  }.#elif !
22200 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
22210 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
22220 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69  GWIN__).  else i
22230 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
22240 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b     char *zMulti;
22250 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64  .    LPWSTR zWid
22260 65 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d  ePath = sqlite3M
22270 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a  allocZero( nMax*
22280 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b  sizeof(WCHAR) );
22290 0a 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50  .    if( !zWideP
222a0 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ath ){.      sql
222b0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
222c0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
222d0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
222e0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
222f0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
22300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22310 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
22320 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
22330 65 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a  empPathW(nMax, z
22340 57 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a  WidePath)==0 ){.
22350 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22360 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
22370 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22380 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22390 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
223a0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
223b0 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
223c0 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  TH\n"));.      r
223d0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
223e0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  r(SQLITE_IOERR_G
223f0 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65  ETTEMPPATH, osGe
22400 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54 65         "winGetTe
22430 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20  mpname2", 0);.  
22440 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d    }.    zMulti =
22450 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
22460 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  8(zWidePath);.  
22470 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a    if( zMulti ){.
22480 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
22490 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
224a0 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29  f, "%s", zMulti)
224b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
224c0 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20  free(zMulti);.  
224d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
224e0 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
224f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
22500 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
22510 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Path);.      sql
22520 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22530 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22540 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22550 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
22560 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
22570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22580 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
22590 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
225a0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
225b0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
225c0 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
225d0 63 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20  char *zMbcsPath 
225e0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
225f0 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20  ero( nMax );.   
22600 20 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20   if( !zMbcsPath 
22610 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22620 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22630 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22640 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22650 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22660 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
22670 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22680 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
22690 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50    if( osGetTempP
226a0 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73  athA(nMax, zMbcs
226b0 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Path)==0 ){.    
226c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
226d0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
226e0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
226f0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
22700 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c  ERR_GETTEMPPATH\
22710 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22720 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
22730 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
22740 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  EMPPATH, osGetLa
22750 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
22760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22770 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e      "winGetTempn
22780 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d  ame3", 0);.    }
22790 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c  .    zUtf8 = sql
227a0 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
227b0 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74  to_utf8(zMbcsPat
227c0 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66  h);.    if( zUtf
227d0 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
227e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
227f0 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55  , zBuf, "%s", zU
22800 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
22810 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
22820 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22840 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
22850 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22860 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
22870 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
22880 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22890 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
228a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
228b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
228c0 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65  2_HAS_ANSI */.#e
228d0 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
228e0 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f  OS_WINRT */..  /
228f0 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20  *.  ** Check to 
22900 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74 65  make sure the te
22910 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
22920 79 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61  y ends with an a
22930 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20  ppropriate.  ** 
22940 73 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69  separator.  If i
22950 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74  t does not and t
22960 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75  here is not enou
22970 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f  gh space left to
22980 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66   add.  ** one, f
22990 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ail..  */.  if( 
229a0 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72  !winMakeEndInDir
229b0 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66  Sep(nDir+1, zBuf
229c0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
229d0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
229e0 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
229f0 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
22a00 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20  TE_ERROR\n"));. 
22a10 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
22a20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
22a30 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65  OR, 0, "winGetTe
22a40 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20  mpname4", 0);.  
22a50 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65  }..  /*.  ** Che
22a60 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
22a70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
22a80 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
22a90 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
22aa0 20 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74   .  ** name in t
22ab0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
22ac0 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mat:.  **.  **  
22ad0 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72   "<temporary_dir
22ae0 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58  ectory>/etilqs_X
22af0 58 58 58 58 58 58 58 58 58 58 58 58 58 58 5c 30  XXXXXXXXXXXXXX\0
22b00 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  \0".  **.  ** If
22b10 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
22b20 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20  ITE_ERROR.  The 
22b30 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75 73 65  number 17 is use
22b40 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  d here in order 
22b50 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20  to.  ** account 
22b60 66 6f 72 20 74 68 65 20 73 70 61 63 65 20 75 73  for the space us
22b70 65 64 20 62 79 20 74 68 65 20 31 35 20 63 68 61  ed by the 15 cha
22b80 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75  racter random su
22b90 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a  ffix and the.  *
22ba0 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e  * two trailing N
22bb0 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  UL characters.  
22bc0 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74  The final direct
22bd0 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68  ory separator ch
22be0 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73  aracter.  ** has
22bf0 20 61 6c 72 65 61 64 79 20 61 64 64 65 64 20 69   already added i
22c00 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72  f it was not alr
22c10 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20  eady present..  
22c20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69  */.  nLen = sqli
22c30 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
22c40 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b  );.  if( (nLen +
22c50 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42   nPre + 17) > nB
22c60 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  uf ){.    sqlite
22c70 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22c80 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22c90 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22ca0 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
22cb0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22cc0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
22cd0 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
22ce0 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20  empname5", 0);. 
22cf0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   }..  sqlite3_sn
22d00 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e  printf(nBuf-16-n
22d10 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20  Len, zBuf+nLen, 
22d20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
22d30 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d  _PREFIX);..  j =
22d40 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
22d50 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65  (zBuf);.  sqlite
22d60 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
22d70 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f   &zBuf[j]);.  fo
22d80 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
22d90 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66  , j++){.    zBuf
22da0 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
22db0 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
22dc0 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
22dd0 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
22de0 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d  ];.  }.  zBuf[j]
22df0 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31   = 0;.  zBuf[j+1
22e00 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20  ] = 0;.  *pzBuf 
22e10 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41  = zBuf;..  OSTRA
22e20 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22e30 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  ME name=%s, rc=S
22e40 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75  QLITE_OK\n", zBu
22e50 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  f));.  return SQ
22e60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22e70 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
22e80 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20   the named file 
22e90 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65  is really a dire
22ea0 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66  ctory.  Return f
22eb0 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73  alse if.** it is
22ec0 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
22ed0 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72   than a director
22ee0 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  y, or if there i
22ef0 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65  s any kind of me
22f00 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
22f10 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
22f20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
22f30 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  ir(const void *z
22f40 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57  Converted){.  DW
22f50 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
22f60 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
22f70 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66  lastErrno;..  if
22f80 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
22f90 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
22fa0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
22fb0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
22fc0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
22fd0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
22fe0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
22ff0 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
23000 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
23010 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
23020 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
23030 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23050 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
23060 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
23090 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65  ) && winRetryIoe
230a0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
230b0 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
230c0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65   !rc ){.      re
230d0 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c  turn 0; /* Inval
230e0 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20  id name? */.    
230f0 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41 74  }.    attr = sAt
23100 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
23110 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c  ributes;.#if SQL
23120 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
23130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74    }else{.    att
23140 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
23150 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
23160 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
23170 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
23180 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f   (attr!=INVALID_
23190 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
231a0 20 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41   && (attr&FILE_A
231b0 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
231c0 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  RY);.}../*.** Op
231d0 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  en a file..*/.st
231e0 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
231f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
23200 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  *pVfs,        /*
23210 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d 61 78   Used to get max
23220 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c  imum path name l
23230 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  ength */.  const
23240 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
23250 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
23260 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
23270 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
23280 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
23290 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c  /* Write the SQL
232a0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ite file handle 
232b0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
232c0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
232d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65      /* Open mode
232e0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
232f0 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20  *pOutFlags      
23300 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
23310 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a  return flags */.
23320 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20  ){.  HANDLE h;. 
23330 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
23340 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77   = 0;.  DWORD dw
23350 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20  DesiredAccess;. 
23360 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f   DWORD dwShareMo
23370 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72  de;.  DWORD dwCr
23380 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
23390 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61  n;.  DWORD dwFla
233a0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
233b0 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  = 0;.#if SQLITE_
233c0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69  OS_WINCE.  int i
233d0 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69  sTemp = 0;.#endi
233e0 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  f.  winFile *pFi
233f0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
23400 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  d;.  void *zConv
23410 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  erted;          
23420 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
23430 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a  in OS encoding *
23440 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23450 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d  zUtf8Name = zNam
23460 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69  e; /* Filename i
23470 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67  n UTF-8 encoding
23480 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   */.  int cnt = 
23490 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  0;..  /* If argu
234a0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
234b0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
234c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
234d0 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
234e0 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
234f0 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
23500 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
23510 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
23520 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ..  */.  char *z
23530 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20  Tmpname = 0; /* 
23540 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
23550 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65 73  lename, if neces
23560 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20  sary. */..  int 
23570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
23590 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
235a0 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  de */.#if !defin
235b0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51  ed(NDEBUG) || SQ
235c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
235d0 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
235e0 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
235f0 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
23600 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  o open */.#endif
23610 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
23620 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
23630 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
23640 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
23650 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
23660 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
23670 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
23680 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
23690 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
236a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
236b0 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
236c0 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
236d0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
236e0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
236f0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
23700 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
23710 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
23720 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
23730 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72    int isOpenJour
23740 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20  nal = (isCreate 
23750 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
23760 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23770 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
23780 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
23790 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
237a0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
237b0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
237c0 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65  PEN_WAL.  ));.#e
237d0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
237e0 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
237f0 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d  pFile=%p, flags=
23800 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  %x, pOutFlags=%p
23810 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23820 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66  zUtf8Name, id, f
23830 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
23840 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
23850 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
23860 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
23870 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28  : .  **.  **   (
23880 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f  a) Exactly one o
23890 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20  f the READWRITE 
238a0 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61  and READONLY fla
238b0 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20  gs must be set, 
238c0 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20  and .  **   (b) 
238d0 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74  if CREATE is set
238e0 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45  , then READWRITE
238f0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
23900 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63  t, and.  **   (c
23910 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69  ) if EXCLUSIVE i
23920 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
23930 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
23940 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20  set..  **   (d) 
23950 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  if DELETEONCLOSE
23960 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
23970 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
23980 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e set..  */.  as
23990 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79  sert((isReadonly
239a0 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
239b0 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61  te==0) && (isRea
239c0 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64  dWrite || isRead
239d0 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74  only));.  assert
239e0 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20  (isCreate==0 || 
239f0 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20  isReadWrite);.  
23a00 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69  assert(isExclusi
23a10 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  ve==0 || isCreat
23a20 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44  e);.  assert(isD
23a30 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72  elete==0 || isCr
23a40 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  eate);..  /* The
23a50 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a   main DB, main j
23a60 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65  ournal, WAL file
23a70 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72   and master jour
23a80 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20  nal are never . 
23a90 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
23aa0 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61  y deleted. Nor a
23ab0 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d  re they ever tem
23ac0 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a  porary files.  *
23ad0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  /.  assert( (!is
23ae0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
23af0 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
23b00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
23b10 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
23b20 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
23b30 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
23b40 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
23b50 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
23b60 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
23b70 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
23b80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
23b90 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  ER_JOURNAL );.  
23ba0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
23bb0 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
23bc0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
23bd0 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  EN_WAL );..  /* 
23be0 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
23bf0 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20  upper layer has 
23c00 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22  set one of the "
23c10 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73  file-type" flags
23c20 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65  . */.  assert( e
23c30 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
23c40 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c  N_MAIN_DB      |
23c50 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23c60 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20  OPEN_TEMP_DB .  
23c70 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
23c80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
23c90 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
23ca0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
23cb0 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  MP_JOURNAL .    
23cc0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
23cd0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
23ce0 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
23cf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
23d00 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
23d10 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
23d20 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
23d30 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
23d40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
23d50 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
23d60 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65  pFile!=0 );.  me
23d70 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
23d80 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b  izeof(winFile));
23d90 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e  .  pFile->h = IN
23da0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
23db0 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  UE;..#if SQLITE_
23dc0 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21  OS_WINRT.  if( !
23dd0 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73 71  zUtf8Name && !sq
23de0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
23df0 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  tory ){.    sqli
23e00 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
23e10 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73  RROR,.        "s
23e20 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
23e30 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73  ctory variable s
23e40 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72  hould be set for
23e50 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65   WinRT");.  }.#e
23e60 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
23e70 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23e80 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
23e90 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65  on is NULL, gene
23ea0 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65 6d  rate a .  ** tem
23eb0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
23ec0 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20 20   to use .  */.  
23ed0 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29  if( !zUtf8Name )
23ee0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  {.    assert( is
23ef0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
23f00 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
23f10 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
23f20 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e  ame(pVfs, &zTmpn
23f30 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
23f40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23f50 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
23f60 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
23f70 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  %s", zUtf8Name, 
23f80 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
23f90 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
23fa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
23fb0 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
23fc0 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
23fd0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
23fe0 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
23ff0 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
24000 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
24010 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
24020 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
24030 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
24040 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
24050 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
24060 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
24070 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
24080 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
24090 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
240a0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
240b0 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
240c0 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69    zUtf8Name[sqli
240d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66  te3Strlen30(zUtf
240e0 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
240f0 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
24100 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
24110 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
24120 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
24130 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
24140 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
24150 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
24160 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
24170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24180 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
24190 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
241a0 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
241b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
241c0 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
241d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
241e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
241f0 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44   }..  if( winIsD
24200 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
24210 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
24220 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
24230 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24240 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
24250 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
24260 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
24270 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
24280 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
24290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
242a0 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
242b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
242c0 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
242d0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
242e0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
242f0 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
24300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
24310 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
24320 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
24330 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
24340 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
24350 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
24360 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
24370 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74  e is .  ** creat
24380 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
24390 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
243a0 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
243b0 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61   access" .  ** a
243c0 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
243d0 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
243e0 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
243f0 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
24400 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
24410 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
24420 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
24430 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
24440 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
24450 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
24460 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
24470 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
24480 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
24490 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
244a0 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
244b0 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
244c0 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
244d0 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
244e0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
244f0 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
24500 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
24510 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
24520 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
24530 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
24540 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
24550 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
24560 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
24570 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
24580 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
24590 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
245a0 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
245b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
245c0 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
245d0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
245e0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
245f0 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
24600 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
24610 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24620 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
24630 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
24640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24660 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
24670 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24690 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
246a0 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
246b0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
246c0 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
246d0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
246e0 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
246f0 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
24700 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
24710 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
24720 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
24730 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
24740 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
24750 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
24760 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
24770 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
24780 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
24790 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
247a0 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
247b0 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
247c0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49  endif..  if( osI
247d0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
247e0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
247f0 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54   CREATEFILE2_EXT
24800 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
24810 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
24820 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ers;.    extende
24830 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69  dParameters.dwSi
24840 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41  ze = sizeof(CREA
24850 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
24860 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20  _PARAMETERS);.  
24870 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
24880 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69  ters.dwFileAttri
24890 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20  butes =.        
248a0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
248b0 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
248c0 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a  ATTRIBUTE_MASK;.
248d0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
248e0 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61  meters.dwFileFla
248f0 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41  gs = dwFlagsAndA
24900 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
24910 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20  _FLAG_MASK;.    
24920 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
24930 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73  rs.dwSecurityQos
24940 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59  Flags = SECURITY
24950 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20  _ANONYMOUS;.    
24960 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
24970 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74  rs.lpSecurityAtt
24980 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ributes = NULL;.
24990 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
249a0 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65  meters.hTemplate
249b0 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  File = NULL;.   
249c0 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
249d0 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57  reateFile2((LPCW
249e0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24a10 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
24a40 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20  hareMode,.      
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69          dwCreati
24a70 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20  onDisposition,. 
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78               &ex
24aa0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
24ab0 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
24ac0 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74            winRet
24af0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
24b00 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
24b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24b20 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c  oop */.    }.#el
24b30 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  se.    while( (h
24b40 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57   = osCreateFileW
24b50 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
24b60 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
24b90 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bb0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
24bc0 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
24bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24be0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
24bf0 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
24c20 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c40 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
24c50 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
24c60 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
24c90 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
24ca0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24cc0 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
24cd0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
24ce0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
24cf0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
24d00 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
24d10 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43  CreateFileA((LPC
24d20 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24d50 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
24d80 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24db0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24dc0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
24df0 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
24e20 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
24e30 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
24e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e50 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
24e60 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
24e70 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
24e80 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
24e90 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  /.    }.  }.#end
24ea0 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  if.  winLogIoerr
24eb0 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43  (cnt);..  OSTRAC
24ec0 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70  E(("OPEN file=%p
24ed0 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73  , name=%s, acces
24ee0 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  s=%lx, rc=%s\n",
24ef0 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20   h, zUtf8Name,. 
24f00 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
24f10 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49  redAccess, (h==I
24f20 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
24f30 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
24f40 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28  : "ok"));..  if(
24f50 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
24f60 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
24f70 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
24f80 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
24f90 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
24fa0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70  LITE_CANTOPEN, p
24fb0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
24fc0 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66   "winOpen", zUtf
24fd0 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  8Name);.    sqli
24fe0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24ff0 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
25000 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
25010 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  ;.    if( isRead
25020 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c  Write && !isExcl
25030 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72  usive ){.      r
25040 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56  eturn winOpen(pV
25050 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a  fs, zName, id, .
25060 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
25070 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
25080 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20  DONLY) &.       
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28                ~(
250a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
250b0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
250c0 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20  EADWRITE)),.    
250d0 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b       pOutFlags);
250e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
250f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25100 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
25110 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
25120 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
25130 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
25140 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
25150 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
25160 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
25170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
25180 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
25190 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
251a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f  ;.    }.  }..  O
251b0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69  STRACE(("OPEN fi
251c0 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20  le=%p, name=%s, 
251d0 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74  access=%lx, pOut
251e0 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46  Flags=%p, *pOutF
251f0 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20  lags=%d, ".     
25200 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c        "rc=%s\n",
25210 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64   h, zUtf8Name, d
25220 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
25230 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46  pOutFlags, pOutF
25240 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20  lags ?.         
25250 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30    *pOutFlags : 0
25260 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  , (h==INVALID_HA
25270 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66  NDLE_VALUE) ? "f
25280 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
25290 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
252a0 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65  WINCE.  if( isRe
252b0 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
252c0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
252d0 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20  IN_DB.       && 
252e0 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74  (rc = winceCreat
252f0 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69  eLock(zName, pFi
25300 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a  le))!=SQLITE_OK.
25310 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65    ){.    osClose
25320 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73  Handle(h);.    s
25330 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
25340 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c  verted);.    sql
25350 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
25360 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  me);.    OSTRACE
25370 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20  (("OPEN-CE-LOCK 
25380 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
25390 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  ", zName, sqlite
253a0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
253b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
253c0 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
253d0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44  ){.    pFile->zD
253e0 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  eleteOnClose = z
253f0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c  Converted;.  }el
25400 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
25410 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25420 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
25430 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
25440 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69  zTmpname);.  pFi
25450 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77  le->pMethod = &w
25460 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46  inIoMethod;.  pF
25470 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  ile->pVfs = pVfs
25480 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
25490 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  ;.  if( isReadon
254a0 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  ly ){.    pFile-
254b0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
254c0 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20  NFILE_RDONLY;.  
254d0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  }.  if( sqlite3_
254e0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d  uri_boolean(zNam
254f0 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54  e, "psow", SQLIT
25500 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  E_POWERSAFE_OVER
25510 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46  WRITE) ){.    pF
25520 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
25530 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a  = WINFILE_PSOW;.
25540 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73    }.  pFile->las
25550 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
25560 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  R;.  pFile->zPat
25570 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53  h = zName;.#if S
25580 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
25590 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68  IZE>0.  pFile->h
255a0 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46  Map = NULL;.  pF
255b0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
255c0 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
255d0 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46  apSize = 0;.  pF
255e0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
255f0 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ual = 0;.  pFile
25600 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
25610 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
25620 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
25630 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  if..  OpenCounte
25640 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
25650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
25660 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69  ete the named fi
25670 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  le..**.** Note t
25680 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73  hat Windows does
25690 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c   not allow a fil
256a0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
256b0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  if some other.**
256c0 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20   process has it 
256d0 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73  open.  Sometimes
256e0 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72   a virus scanner
256f0 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f   or indexing pro
25700 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65  gram.** will ope
25710 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
25720 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69   shortly after i
25730 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  t is created in 
25740 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77  order to do.** w
25750 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e  hatever it does.
25760 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68    While this oth
25770 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
25780 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c  lding the.** fil
25790 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20  e open, we will 
257a0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c  be unable to del
257b0 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b  ete it.  To work
257c0 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20   around this.** 
257d0 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61  problem, we dela
257e0 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  y 100 millisecon
257f0 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65  ds and try to de
25800 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a  lete again.  Up.
25810 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f  ** to MX_DELETIO
25820 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74  N_ATTEMPTs delet
25830 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65  ion attempts are
25840 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69   run before givi
25850 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74  ng.** up and ret
25860 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e  urning an error.
25870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
25880 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69  inDelete(.  sqli
25890 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
258a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
258b0 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
258c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
258d0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a  ilename,      /*
258e0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
258f0 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
25900 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
25910 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
25920 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
25930 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  .){.  int cnt = 
25940 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  0;.  int rc;.  D
25950 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f  WORD attr;.  DWO
25960 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
25970 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
25980 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
25990 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
259a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
259b0 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20  ER(syncDir);..  
259c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
259d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
259e0 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f  ERR_DELETE);.  O
259f0 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
25a00 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72  name=%s, syncDir
25a10 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%d\n", zFilenam
25a20 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20  e, syncDir));.. 
25a30 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
25a40 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
25a50 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
25a60 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
25a70 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
25a80 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
25a90 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
25aa0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
25ab0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  n", zFilename));
25ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25ad0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
25ae0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
25af0 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23  () ){.    do {.#
25b00 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25b10 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46  RT.      WIN32_F
25b20 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
25b30 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
25b40 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
25b50 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
25b60 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
25b70 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46 69      if ( osGetFi
25b80 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
25b90 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46  zConverted, GetF
25ba0 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
25bb0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
25bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bd0 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
25be0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
25bf0 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
25c00 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
25c10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25c20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
25c30 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
25c40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
25c50 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
25c60 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
25c70 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
25c80 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
25c90 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
25ca0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
25cb0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
25cc0 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
25cd0 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
25ce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25cf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25d00 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
25d10 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25d20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
25d30 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
25d40 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
25d50 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
25d60 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 20 61  dif.      if ( a
25d70 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr==INVALID_FIL
25d80 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a  E_ATTRIBUTES ){.
25d90 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
25da0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
25db0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
25dc0 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
25dd0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
25de0 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
25df0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
25e00 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
25e10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
25e20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
25e30 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
25e40 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
25e50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25e60 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25e70 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
25e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
25e90 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25ea0 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45    if ( attr&FILE
25eb0 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
25ec0 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20  TORY ){.        
25ed0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
25ee0 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79  R; /* Files only
25ef0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
25f00 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
25f10 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46    if ( osDeleteF
25f20 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29  ileW(zConverted)
25f30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25f40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44   SQLITE_OK; /* D
25f50 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20  eleted OK. */.  
25f60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
25f70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
25f80 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26  !winRetryIoerr(&
25f90 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
25fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
25fb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
25fc0 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65  * No more retrie
25fd0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  s. */.        br
25fe0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25ff0 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d   } while(1);.  }
26000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
26010 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
26020 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
26030 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
26040 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
26050 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
26060 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
26070 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
26080 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
26090 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
260a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
260b0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
260c0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
260d0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
260e0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
260f0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
26100 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
26110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26120 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
26130 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
26140 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
26150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26160 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26170 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
26180 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26190 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
261a0 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
261b0 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
261c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
261d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
261e0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
261f0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26200 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
26210 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a   osDeleteFileA(z
26220 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
26230 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26240 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
26250 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
26260 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26270 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
26280 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
26290 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
262a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
262b0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
262c0 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
262d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
262e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
262f0 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  le(1);.  }.#endi
26300 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63  f.  if( rc && rc
26310 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  !=SQLITE_IOERR_D
26320 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20  ELETE_NOENT ){. 
26330 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
26340 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
26350 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72  _DELETE, lastErr
26360 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65 22 2c  no, "winDelete",
26370 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d   zFilename);.  }
26380 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67  else{.    winLog
26390 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a  Ioerr(cnt);.  }.
263a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
263b0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53  Converted);.  OS
263c0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e  TRACE(("DELETE n
263d0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22  ame=%s, rc=%s\n"
263e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
263f0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
26400 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26410 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
26420 68 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64  he existence and
26430 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c   status of a fil
26440 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26450 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71   winAccess(.  sq
26460 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
26470 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
26480 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
26490 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
264a0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Filename,     /*
264b0 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
264c0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
264d0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
264e0 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
264f0 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f  f test to make o
26500 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
26510 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20   int *pResOut   
26520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26530 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b  UT: Result */.){
26540 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
26550 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44   int rc = 0;.  D
26560 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
26570 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   0;.  void *zCon
26580 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
26590 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
265a0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
265b0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
265c0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
265d0 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ; );.  OSTRACE((
265e0 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
265f0 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f   flags=%x, pResO
26600 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  ut=%p\n",.      
26610 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
26620 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29  flags, pResOut))
26630 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  ;..  zConverted 
26640 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
26650 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
26660 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
26670 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
26680 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 43      OSTRACE(("AC
26690 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63  CESS name=%s, rc
266a0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
266b0 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  MEM\n", zFilenam
266c0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
266d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
266e0 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  EM;.  }.  if( os
266f0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  IsNT() ){.    in
26700 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
26710 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
26720 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
26730 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
26740 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
26750 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
26760 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
26770 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
26780 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
26790 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
267c0 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
267d0 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  rd, .           
267e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267f0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
26800 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
26810 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26820 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
26830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
26840 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
26850 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
26860 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
26870 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
26880 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
26890 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
268a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
268b0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
268c0 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
268d0 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
268e0 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
268f0 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  h==0 .          
26900 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
26910 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a  leSizeLow==0 ){.
26920 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
26930 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
26940 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65  IBUTES;.      }e
26950 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
26960 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
26970 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
26980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
26990 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49  e{.      winLogI
269a0 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20  oerr(cnt);.     
269b0 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d   if( lastErrno!=
269c0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
269d0 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e  OUND && lastErrn
269e0 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o!=ERROR_PATH_NO
269f0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
26a00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26a10 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
26a20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
26a30 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
26a40 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73  OERR_ACCESS, las
26a50 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65  tErrno, "winAcce
26a60 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ss",.           
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
26a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26aa0 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
26ab0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
26ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26ad0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
26ae0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
26af0 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72    else{.    attr
26b00 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
26b10 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
26b20 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
26b30 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
26b40 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
26b50 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
26b60 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
26b70 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
26b80 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  D:.    case SQLI
26b90 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
26ba0 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
26bb0 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
26bc0 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
26bd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
26be0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
26bf0 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
26c00 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
26c10 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
26c20 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20  TES &&.         
26c30 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45      (attr & FILE
26c40 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f  _ATTRIBUTE_READO
26c50 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62  NLY)==0;.      b
26c60 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
26c70 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
26c80 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
26c90 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
26ca0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b    *pResOut = rc;
26cb0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43  .  OSTRACE(("ACC
26cc0 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65  ESS name=%s, pRe
26cd0 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
26ce0 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
26cf0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
26d00 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65    zFilename, pRe
26d10 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29  sOut, *pResOut))
26d20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26d30 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
26d40 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
26d50 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
26d60 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
26d70 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c  s with a drive l
26d80 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65  etter.** followe
26d90 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61  d by a colon cha
26da0 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
26db0 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76  c BOOL winIsDriv
26dc0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
26dd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26de0 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65  Pathname.){.  re
26df0 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49 73  turn ( sqlite3Is
26e00 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b  alpha(zPathname[
26e10 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65  0]) && zPathname
26e20 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f  [1]==':' );.}../
26e30 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e  *.** Returns non
26e40 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
26e50 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65  cified path name
26e60 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
26e70 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a  verbatim.  If.**
26e80 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
26e90 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20  urned from this 
26ea0 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61  function, the ca
26eb0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
26ec0 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73  ust simply.** us
26ed0 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 70  e the provided p
26ee0 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69  ath name verbati
26ef0 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69  m -OR- resolve i
26f00 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  t into a full pa
26f10 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67  th name.** using
26f20 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68   the GetFullPath
26f30 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66  Name Win32 API f
26f40 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69  unction (if avai
26f50 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  lable)..*/.stati
26f60 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62  c BOOL winIsVerb
26f70 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20  atimPathname(.  
26f80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
26f90 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20  hname.){.  /*.  
26fa0 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
26fb0 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
26fc0 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20  a forward slash 
26fd0 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20  or a backslash, 
26fe0 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a  it is either.  *
26ff0 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61  * a legal UNC na
27000 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c  me, a volume rel
27010 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61  ative path, or a
27020 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20  n absolute path 
27030 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  name in the.  **
27040 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f   "Unix" format o
27050 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72  n Windows.  Ther
27060 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79  e is no easy way
27070 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
27080 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  e between.  ** t
27090 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73  he final two cas
270a0 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77  es; therefore, w
270b0 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 66  e return the saf
270c0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
270d0 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20  of TRUE.  ** so 
270e0 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20  that callers of 
270f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
27100 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74  ll simply use it
27110 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a   verbatim..  */.
27120 20 20 69 66 20 28 20 77 69 6e 49 73 44 69 72 53    if ( winIsDirS
27130 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ep(zPathname[0])
27140 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
27150 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
27160 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
27170 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
27180 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20   a letter and a 
27190 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68  colon it is eith
271a0 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a  er a volume.  **
271b0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f   relative path o
271c0 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
271d0 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20  th.  Callers of 
271e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
271f0 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65  st not.  ** atte
27200 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20  mpt to treat it 
27210 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  as a relative pa
27220 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68  th name (i.e. th
27230 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79  ey should simply
27240 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72   use.  ** it ver
27250 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69  batim)..  */.  i
27260 66 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65  f ( winIsDriveLe
27270 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61  tterAndColon(zPa
27280 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72  thname) ){.    r
27290 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
272a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  /*.  ** If we
272b0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
272c0 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d  nt, the path nam
272d0 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20  e should almost 
272e0 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70  certainly be a p
272f0 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74  urely.  ** relat
27300 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f  ive one (i.e. no
27310 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f  t a UNC name, no
27320 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20  t absolute, and 
27330 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  not volume relat
27340 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  ive)..  */.  ret
27350 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a  urn FALSE;.}../*
27360 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
27370 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
27380 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
27390 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75  e.  Write the fu
273a0 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69  ll.** pathname i
273b0 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75  nto zOut[].  zOu
273c0 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c  t[] will be at l
273d0 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  east pVfs->mxPat
273e0 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69  hname.** bytes i
273f0 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
27400 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74  c int winFullPat
27410 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
27420 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
27430 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
27440 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
27450 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
27460 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20  *zRelative,     
27470 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
27480 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
27490 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c  th */.  int nFul
274a0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
274b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
274c0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
274d0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
274e0 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
274f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
27500 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
27510 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  {.  .#if defined
27520 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
27530 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
27540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
27550 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
27560 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
27570 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c  ;.  assert( nFul
27580 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l>=pVfs->mxPathn
27590 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ame );.  if ( sq
275a0 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
275b0 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
275c0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
275d0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
275e0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
275f0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
27600 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
27610 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
27620 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
27630 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
27640 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
27650 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
27660 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
27670 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
27680 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
27690 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
276a0 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
276b0 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
276c0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
276d0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
276e0 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20  and a slash..   
276f0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   */.    char *zO
27700 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ut = sqlite3Mall
27710 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78  ocZero( pVfs->mx
27720 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20  Pathname+1 );.  
27730 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20    if( !zOut ){. 
27740 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27750 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
27760 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79      }.    if( cy
27770 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
27780 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49              (osI
27790 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49  sNT() ? CCP_POSI
277a0 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50  X_TO_WIN_W : CCP
277b0 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29  _POSIX_TO_WIN_A)
277c0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43   |.            C
277d0 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65  CP_RELATIVE, zRe
277e0 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56  lative, zOut, pV
277f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
27800 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )<0 ){.      sql
27810 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
27820 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
27830 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
27840 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
27850 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
27860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27870 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
27880 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
27890 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
278a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
278b0 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
278c0 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
278d0 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  me(zOut);.      
278e0 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
278f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27900 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
27910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27920 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
27930 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
27940 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
27950 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
27960 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
27970 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27990 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
279a0 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
279b0 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38 29  DirSep(), zUtf8)
279c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
279d0 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
279e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
279f0 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zOut);.    }.  }
27a00 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
27a10 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  zOut = sqlite3Ma
27a20 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e  llocZero( pVfs->
27a30 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a  mxPathname+1 );.
27a40 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b      if( !zOut ){
27a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
27a60 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
27a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27a80 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
27a90 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f  (.            (o
27aa0 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f  sIsNT() ? CCP_PO
27ab0 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43  SIX_TO_WIN_W : C
27ac0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
27ad0 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  A),.            
27ae0 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
27af0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27b00 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  e+1)<0 ){.      
27b10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27b20 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
27b30 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
27b40 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
27b50 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
27b60 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
27b80 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
27b90 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
27ba0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
27bb0 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e  har *zUtf8 = win
27bc0 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
27bd0 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20  ename(zOut);.   
27be0 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
27bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27c00 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
27c10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27c20 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
27c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
27c40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
27c50 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
27c60 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
27c70 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  ll, "%s", zUtf8)
27c80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
27c90 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
27ca0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27cb0 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zOut);.    }.  }
27cc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27cd0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
27ce0 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   (SQLITE_OS_WINC
27cf0 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
27d00 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65  INRT) && !define
27d10 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
27d20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
27d30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27d40 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e  RROR );.  /* Win
27d50 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
27d60 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
27d70 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
27d80 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
27d90 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20  /* WinRT has no 
27da0 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  way to convert a
27db0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74   relative path t
27dc0 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e  o an absolute on
27dd0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c  e. */.  if ( sql
27de0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
27df0 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
27e00 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
27e10 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
27e20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
27e30 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
27e40 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
27e50 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
27e60 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
27e70 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
27e80 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
27e90 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
27ea0 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
27eb0 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
27ec0 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
27ed0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
27ee0 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
27ef0 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
27f00 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
27f10 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
27f20 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
27f30 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
27f40 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
27f50 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
27f60 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
27f70 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
27fa0 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
27fb0 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rSep(), zRelativ
27fc0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
27fd0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
27fe0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
27ff0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
28000 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
28010 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72  lative);.  }.  r
28020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28030 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
28040 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
28050 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
28060 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
28070 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52  CYGWIN__).  DWOR
28080 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20  D nByte;.  void 
28090 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63  *zConverted;.  c
280a0 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a  har *zOut;..  /*
280b0 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61   If this path na
280c0 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
280d0 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20  /X:", where "X" 
280e0 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69  is any alphabeti
280f0 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  c.  ** character
28100 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e  , discard the in
28110 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74  itial "/" from t
28120 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a  he pathname..  *
28130 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76  /.  if( zRelativ
28140 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e  e[0]=='/' && win
28150 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
28160 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b  Colon(zRelative+
28170 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74  1) ){.    zRelat
28180 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ive++;.  }..  /*
28190 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
281a0 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
281b0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
281c0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
281d0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
281e0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
281f0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
28200 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
28210 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
28220 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
28230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
28240 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
28250 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
28260 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
28270 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
28280 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
28290 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
282a0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
282b0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
282c0 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
282d0 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
282e0 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
282f0 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
28300 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
28310 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
28320 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
28330 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
28340 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
28350 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
28360 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
28370 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
28380 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
28390 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
283a0 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
283b0 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
283c0 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
283d0 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
283e0 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
283f0 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
28400 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63  ectory and a bac
28410 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20  kslash..    */. 
28420 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
28430 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
28440 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
28450 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73  , zFull, "%s%c%s
28460 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28480 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
28490 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
284a0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
284b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
284c0 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74  ;.  }.  zConvert
284d0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
284e0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
284f0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66  zRelative);.  if
28500 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
28510 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28520 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28530 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
28540 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53  NT() ){.    LPWS
28550 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  TR zTemp;.    nB
28560 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
28570 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
28580 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  R)zConverted, 0,
28590 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
285a0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
285b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
285c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
285d0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
285e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
285f0 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
28600 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
28610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28620 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
28630 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
28640 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
28650 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
28660 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
28670 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
28680 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
28690 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
286a0 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
286b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
286c0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
286d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
286e0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
286f0 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
28700 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
28710 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
28720 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
28730 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  Temp, 0);.    if
28740 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
28750 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28760 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28770 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28780 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72  (zTemp);.      r
28790 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
287a0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
287b0 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
287c0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
287f0 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
28800 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
28810 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28820 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
28830 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  Out = winUnicode
28840 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  ToUtf8(zTemp);. 
28850 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28860 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64  zTemp);.  }.#ifd
28870 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
28880 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
28890 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
288a0 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
288b0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
288c0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
288d0 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ed, 0, 0, 0);.  
288e0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
288f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28900 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28910 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
28920 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
28930 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
28940 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
28950 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
28980 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  3", zRelative);.
28990 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
289a0 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20  += 3;.    zTemp 
289b0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
289c0 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
289d0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
289e0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
289f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28a00 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28a10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28a20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28a30 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  EM;.    }.    nB
28a40 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
28a50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
28a60 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
28a70 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
28a80 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
28a90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28aa0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28ab0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28ac0 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
28ad0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
28ae0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
28af0 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
28b00 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
28b10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28b20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
28b30 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20 7a  ullPathname4", z
28b40 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
28b50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28b60 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28b70 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
28b80 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
28b90 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
28ba0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
28bb0 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  emp);.  }.#endif
28bc0 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
28bd0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
28be0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
28bf0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
28c00 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
28c10 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
28c20 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
28c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28c40 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
28c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28c60 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
28c70 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65  #endif.}..#ifnde
28c80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
28c90 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
28ca0 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
28cb0 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
28cc0 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
28cd0 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
28ce0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
28cf0 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
28d00 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
28d10 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
28d20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
28d30 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33  inDlOpen(sqlite3
28d40 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73  _vfs *pVfs, cons
28d50 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
28d60 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  e){.  HANDLE h;.
28d70 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
28d80 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46  GWIN__).  int nF
28d90 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ull = pVfs->mxPa
28da0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72  thname+1;.  char
28db0 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65   *zFull = sqlite
28dc0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75  3MallocZero( nFu
28dd0 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  ll );.  void *zC
28de0 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
28df0 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a  if( zFull==0 ){.
28e00 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c      OSTRACE(("DL
28e10 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
28e20 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
28e30 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29  ename, (void*)0)
28e40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
28e50 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 46 75  .  }.  if( winFu
28e60 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
28e70 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
28e80 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54  l, zFull)!=SQLIT
28e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
28ea0 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b  te3_free(zFull);
28eb0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
28ec0 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
28ed0 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
28ee0 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
28ef0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
28f00 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74  ;.  }.  zConvert
28f10 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
28f20 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
28f30 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65  zFull);.  sqlite
28f40 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23  3_free(zFull);.#
28f50 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  else.  void *zCo
28f60 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
28f70 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
28f80 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
28f90 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28fa0 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e 64 69  TER(pVfs);.#endi
28fb0 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  f.  if( zConvert
28fc0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
28fd0 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
28fe0 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
28ff0 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
29000 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
29010 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
29020 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
29030 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
29040 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  NRT.    h = osLo
29050 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
29060 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  y((LPCWSTR)zConv
29070 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65  erted, 0);.#else
29080 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c  .    h = osLoadL
29090 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52  ibraryW((LPCWSTR
290a0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
290b0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
290c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
290d0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
290e0 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
290f0 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  aryA((char*)zCon
29100 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e  verted);.  }.#en
29110 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
29120 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
29130 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
29140 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
29150 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  h));.  sqlite3_f
29160 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29170 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
29180 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
29190 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
291a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
291b0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
291c0 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
291d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
291e0 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74  s);.  winGetLast
291f0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
29200 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
29210 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61   zBufOut);.}.sta
29220 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c  tic void (*winDl
29230 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20  Sym(sqlite3_vfs 
29240 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63  *pVfs,void *pH,c
29250 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29  onst char *zSym)
29260 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 50 52  )(void){.  FARPR
29270 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45  OC proc;.  UNUSE
29280 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
29290 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47 65  );.  proc = osGe
292a0 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
292b0 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b  ANDLE)pH, zSym);
292c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 53  .  OSTRACE(("DLS
292d0 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79  YM handle=%p, sy
292e0 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73 73  mbol=%s, address
292f0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
29300 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53     (void*)pH, zS
29310 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63 29  ym, (void*)proc)
29320 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  );.  return (voi
29330 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f 63 3b  d(*)(void))proc;
29340 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
29350 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  inDlClose(sqlite
29360 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
29370 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
29380 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29390 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c  pVfs);.  osFreeL
293a0 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70  ibrary((HANDLE)p
293b0 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41  Handle);.  OSTRA
293c0 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e  CE(("DLCLOSE han
293d0 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64  dle=%p\n", (void
293e0 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23  *)pHandle));.}.#
293f0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
29400 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
29410 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
29420 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77  : */.  #define w
29430 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  inDlOpen  0.  #d
29440 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72  efine winDlError
29450 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
29460 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
29470 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30  ine winDlClose 0
29480 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
29490 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66  Write up to nBuf
294a0 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
294b0 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a  ness into zBuf..
294c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
294d0 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  nRandomness(sqli
294e0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
294f0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
29500 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  Buf){.  int n = 
29510 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
29520 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66  METER(pVfs);.#if
29530 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
29540 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66  TEST).  n = nBuf
29550 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
29560 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65   0, nBuf);.#else
29570 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59  .  if( sizeof(SY
29580 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d  STEMTIME)<=nBuf-
29590 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54  n ){.    SYSTEMT
295a0 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74  IME x;.    osGet
295b0 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a  SystemTime(&x);.
295c0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
295d0 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  [n], &x, sizeof(
295e0 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  x));.    n += si
295f0 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69  zeof(x);.  }.  i
29600 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
29610 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
29620 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65  DWORD pid = osGe
29630 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
29640 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d();.    memcpy(
29650 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20  &zBuf[n], &pid, 
29660 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
29670 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69    n += sizeof(pi
29680 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  d);.  }.#if SQLI
29690 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
296a0 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f  ( sizeof(ULONGLO
296b0 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  NG)<=nBuf-n ){. 
296c0 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74     ULONGLONG cnt
296d0 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
296e0 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  t64();.    memcp
296f0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
29700 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
29710 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
29720 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  cnt);.  }.#else.
29730 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
29740 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
29750 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f     DWORD cnt = o
29760 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b  sGetTickCount();
29770 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
29780 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
29790 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
297a0 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
297b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
297c0 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
297d0 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
297e0 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
297f0 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
29800 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
29810 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65  nter(&i);.    me
29820 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29830 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20  i, sizeof(i));. 
29840 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69     n += sizeof(i
29850 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
29860 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
29870 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
29880 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
29890 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
298a0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
298b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
298c0 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  nSleep(sqlite3_v
298d0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69  fs *pVfs, int mi
298e0 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74  crosec){.  sqlit
298f0 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28  e3_win32_sleep((
29900 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
29910 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
29920 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
29930 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
29940 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
29950 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
29960 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
29970 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
29980 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
29990 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
299a0 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
299b0 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
299c0 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
299d0 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
299e0 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
299f0 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
29a00 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
29a10 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
29a20 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
29a30 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
29a40 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
29a50 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
29a60 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
29a70 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
29a80 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
29a90 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
29aa0 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
29ab0 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
29ac0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
29ad0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
29ae0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
29af0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
29b00 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
29b10 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
29b20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
29b30 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
29b40 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
29b50 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
29b60 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
29b70 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
29b80 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
29b90 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
29ba0 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
29bb0 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
29bc0 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
29bd0 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
29be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29bf0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
29c00 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
29c10 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
29c20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
29c30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29c40 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
29c50 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
29c60 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
29c70 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
29c80 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
29c90 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
29ca0 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
29cb0 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
29cc0 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
29cd0 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
29ce0 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
29cf0 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
29d00 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
29d10 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
29d20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
29d30 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
29d40 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
29d50 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
29d60 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
29d70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
29d80 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
29d90 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
29da0 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
29db0 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
29dc0 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
29dd0 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
29de0 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
29df0 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
29e00 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
29e10 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
29e20 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
29e30 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71  lue = .      (sq
29e40 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
29e50 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
29e60 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
29e70 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
29e80 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
29e90 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
29ea0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
29eb0 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
29ec0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
29ed0 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
29ee0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
29ef0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
29f00 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
29f10 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
29f20 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
29f30 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
29f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
29f50 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
29f60 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
29f70 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
29f80 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
29f90 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
29fa0 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
29fb0 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
29fc0 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
29fd0 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
29fe0 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20  itValue) + .    
29ff0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
2a000 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c  te3_int64)ft.dwL
2a010 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c  owDateTime)/(sql
2a020 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30  ite3_int64)10000
2a030 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
2a040 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
2a050 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
2a060 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
2a070 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
2a080 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
2a090 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
2a0a0 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
2a0b0 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
2a0c0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
2a0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a0e0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
2a0f0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
2a100 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
2a110 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
2a120 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
2a130 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2a140 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2a150 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
2a160 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
2a170 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
2a180 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
2a190 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
2a1a0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
2a1b0 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
2a1c0 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
2a1d0 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
2a1e0 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  prNow){.  int rc
2a1f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
2a200 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43  4 i;.  rc = winC
2a210 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
2a220 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28  pVfs, &i);.  if(
2a230 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e   !rc ){.    *prN
2a240 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
2a250 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2a260 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
2a270 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68   idea is that th
2a280 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
2a290 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61  s like a combina
2a2a0 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61  tion of.** GetLa
2a2b0 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f  stError() and Fo
2a2c0 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e  rmatMessage() on
2a2d0 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72   Windows (or err
2a2e0 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72  no and.** strerr
2a2f0 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e  or_r() on Unix).
2a300 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   After an error 
2a310 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  is returned by a
2a320 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  n OS.** function
2a330 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  , SQLite calls t
2a340 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  his function wit
2a350 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20  h zBuf pointing 
2a360 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f  to.** a buffer o
2a370 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68  f nBuf bytes. Th
2a380 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c  e OS layer shoul
2a390 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a  d populate the.*
2a3a0 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20  * buffer with a 
2a3b0 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  nul-terminated U
2a3c0 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72  TF-8 encoded err
2a3d0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65  or message.** de
2a3e0 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73  scribing the las
2a3f0 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61  t IO error to ha
2a400 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68  ve occurred with
2a410 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  in the calling.*
2a420 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  * thread..**.** 
2a430 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  If the error mes
2a440 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  sage is too larg
2a450 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69  e for the suppli
2a460 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74  ed buffer,.** it
2a470 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
2a480 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e  ated. The return
2a490 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61   value of xGetLa
2a4a0 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65  stError.** is ze
2a4b0 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
2a4c0 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
2a4d0 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
2a4e0 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
2a4f0 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
2a500 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
2a510 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  ed). If non-zero
2a520 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
2a530 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
2a540 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63  necessary to inc
2a550 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72  lude the nul-ter
2a560 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65  minator characte
2a570 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70  r.** in the outp
2a580 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ut buffer..**.**
2a590 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61   Not supplying a
2a5a0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2a5b0 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76  will have no adv
2a5c0 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f  erse effect.** o
2a5d0 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20  n SQLite. It is 
2a5e0 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20  fine to have an 
2a5f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
2a600 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74  hat never.** ret
2a610 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  urns an error me
2a620 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  ssage:.**.**   i
2a630 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  nt xGetLastError
2a640 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2a650 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
2a660 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20  ar *zBuf){.**   
2a670 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d    assert(zBuf[0]
2a680 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20  =='\0');.**     
2a690 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d  return 0;.**   }
2a6a0 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69  .**.** However i
2a6b0 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  f an error messa
2a6c0 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ge is supplied, 
2a6d0 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72  it will be incor
2a6e0 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71  porated.** by sq
2a6f0 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72  lite into the er
2a700 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69  ror message avai
2a710 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2a720 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  r using.** sqlit
2a730 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73  e3_errmsg(), pos
2a740 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20  sibly making IO 
2a750 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f  errors easier to
2a760 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69   debug..*/.stati
2a770 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
2a780 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2a790 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2a7a0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2a7b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a7c0 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
2a7d0 72 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  rn winGetLastErr
2a7e0 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
2a7f0 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
2a800 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  uf);.}../*.** In
2a810 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
2a820 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
2a830 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
2a840 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
2a850 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
2a860 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2a870 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2a880 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8a0 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
2a8b0 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
2a8c0 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73  le),     /* szOs
2a8d0 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49  File */.    SQLI
2a8e0 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
2a8f0 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61  H_BYTES, /* mxPa
2a900 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
2a930 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20 20     "win32",     
2a940 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65          /* zName
2a950 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a970 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
2a980 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
2a990 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2a9a0 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2a9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
2a9c0 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
2a9d0 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
2a9e0 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
2a9f0 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
2aa00 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  me,     /* xFull
2aa10 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2aa20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2aa30 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
2aa40 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
2aa50 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  r,          /* x
2aa60 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
2aa70 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
2aa80 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f      /* xDlSym */
2aa90 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c  .    winDlClose,
2aaa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2aab0 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
2aac0 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
2aad0 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2aae0 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2aaf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ab00 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
2ab10 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
2ab20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2ab30 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
2ab40 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f  LastError,     /
2ab50 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2ab60 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2ab70 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78  tTimeInt64, /* x
2ab80 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2ab90 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79   */.    winSetSy
2aba0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
2abb0 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
2abc0 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
2abd0 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47  emCall,    /* xG
2abe0 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  etSystemCall */.
2abf0 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65      winNextSyste
2ac00 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78  mCall,   /* xNex
2ac10 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2ac20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   };.#if defined(
2ac30 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2ac40 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63 20  _WIDE).  static 
2ac50 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c  sqlite3_vfs winL
2ac60 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20  ongPathVfs = {. 
2ac70 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
2ac80 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
2ac90 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f  ion */.    sizeo
2aca0 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20  f(winFile),     
2acb0 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
2acc0 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f     SQLITE_WINNT_
2acd0 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20  MAX_PATH_BYTES, 
2ace0 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
2acf0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2ad00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2ad10 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2ad20 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 2f  -longpath",    /
2ad30 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
2ad40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ad50 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
2ad60 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20  */.    winOpen, 
2ad70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ad80 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2ad90 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2ada0 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
2adb0 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
2adc0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2add0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
2ade0 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
2adf0 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
2ae00 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e  */.    winDlOpen
2ae10 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2ae20 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
2ae30 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
2ae40 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2ae50 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2ae60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2ae70 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
2ae80 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
2ae90 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
2aea0 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73      winRandomnes
2aeb0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
2aec0 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
2aed0 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
2aee0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
2aef0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2af00 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
2af10 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
2af20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2af30 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
2af40 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  tError */.    wi
2af50 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2af60 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
2af70 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
2af80 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
2af90 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2afa0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2afb0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2afc0 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
2afd0 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
2afe0 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
2aff0 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61  /* xNextSystemCa
2b000 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69  ll */.  };.#endi
2b010 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63  f..  /* Double-c
2b020 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53  heck that the aS
2b030 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68  yscall[] array h
2b040 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63  as been construc
2b050 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74  ted.  ** correct
2b060 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  ly.  See ticket 
2b070 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36  [bb3a86e890c8e96
2b080 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ab] */.  assert(
2b090 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63   ArraySize(aSysc
2b0a0 61 6c 6c 29 3d 3d 37 36 20 29 3b 0a 0a 20 20 2f  all)==76 );..  /
2b0b0 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70  * get memory map
2b0c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e   allocation gran
2b0d0 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d  ularity */.  mem
2b0e0 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c  set(&winSysInfo,
2b0f0 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45   0, sizeof(SYSTE
2b100 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51  M_INFO));.#if SQ
2b110 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2b120 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
2b130 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
2b140 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65  o);.#else.  osGe
2b150 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  tSystemInfo(&win
2b160 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  SysInfo);.#endif
2b170 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
2b180 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
2b190 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20  onGranularity>0 
2b1a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  );.  assert( win
2b1b0 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
2b1c0 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ze>0 );..  sqlit
2b1d0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
2b1e0 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69  &winVfs, 1);..#i
2b1f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2b200 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2b210 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
2b220 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67  egister(&winLong
2b230 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e  PathVfs, 0);.#en
2b240 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
2b250 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74  LITE_OK; .}..int
2b260 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
2b270 76 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c 49  void){ .#if SQLI
2b280 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
2b290 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
2b2a0 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
2b2b0 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b  andle(sleepObj);
2b2c0 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
2b2d0 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  NULL;.  }.#endif
2b2e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b2f0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
2b300 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  * SQLITE_OS_WIN 
2b310 2a 2f 0a                                         */.