/ Hex Artifact Content
Login

Artifact d37c3e70e85f9c9bfb2e0dad1b1d8714077fbf8d:


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 20 20 20 20 20 28 76 6f 69  LUE(x)      (voi
1150: 64 29 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  d)(x).#endif../*
1160: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
1170: 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 73  character that s
1180: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73  hould be used as
1190: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   the directory s
11a0: 65 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69 66  eparator..*/.#if
11b0: 6e 64 65 66 20 77 69 6e 47 65 74 44 69 72 53 65  ndef winGetDirSe
11c0: 70 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 47  p.#  define winG
11d0: 65 74 44 69 72 53 65 70 28 29 20 20 20 20 20 20  etDirSep()      
11e0: 20 20 20 20 20 20 20 20 20 20 27 5c 5c 27 0a 23            '\\'.#
11f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
1200: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6e 75 61  we need to manua
1210: 6c 6c 79 20 64 65 66 69 6e 65 20 74 68 65 20 57  lly define the W
1220: 69 6e 33 32 20 66 69 6c 65 20 6d 61 70 70 69 6e  in32 file mappin
1230: 67 20 41 50 49 73 20 66 6f 72 20 75 73 65 20 77  g APIs for use w
1240: 69 74 68 20 57 41 4c 0a 2a 2a 20 6d 6f 64 65 20  ith WAL.** mode 
1250: 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49 73  (e.g. these APIs
1260: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69   are available i
1270: 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 20 43 45  n the Windows CE
1280: 20 53 44 4b 3b 20 68 6f 77 65 76 65 72 2c 20 74   SDK; however, t
1290: 68 65 79 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 70  hey.** are not p
12a0: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68 65  resent in the he
12b0: 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a 23  ader file)?.*/.#
12c0: 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  if SQLITE_WIN32_
12d0: 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20  FILEMAPPING_API 
12e0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
12f0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 2f 2a 0a  TE_OMIT_WAL)./*.
1300: 2a 2a 20 54 77 6f 20 6f 66 20 74 68 65 20 66 69  ** Two of the fi
1310: 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73 20  le mapping APIs 
1320: 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 75 6e  are different un
1330: 64 65 72 20 57 69 6e 52 54 2e 20 20 46 69 67 75  der WinRT.  Figu
1340: 72 65 20 6f 75 74 20 77 68 69 63 68 0a 2a 2a 20  re out which.** 
1350: 73 65 74 20 77 65 20 6e 65 65 64 2e 0a 2a 2f 0a  set we need..*/.
1360: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1370: 4e 52 54 0a 57 49 4e 42 41 53 45 41 50 49 20 48  NRT.WINBASEAPI H
1380: 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65  ANDLE WINAPI Cre
1390: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
13a0: 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20 5c 0a  omApp(HANDLE, \.
13b0: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
13c0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 55  TY_ATTRIBUTES, U
13d0: 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20 4c  LONG, ULONG64, L
13e0: 50 43 57 53 54 52 29 3b 0a 0a 57 49 4e 42 41 53  PCWSTR);..WINBAS
13f0: 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49 4e 41  EAPI LPVOID WINA
1400: 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  PI MapViewOfFile
1410: 46 72 6f 6d 41 70 70 28 48 41 4e 44 4c 45 2c 20  FromApp(HANDLE, 
1420: 55 4c 4f 4e 47 2c 20 55 4c 4f 4e 47 36 34 2c 20  ULONG, ULONG64, 
1430: 53 49 5a 45 5f 54 29 3b 0a 23 65 6c 73 65 0a 23  SIZE_T);.#else.#
1440: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1450: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1460: 29 0a 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e  ).WINBASEAPI HAN
1470: 44 4c 45 20 57 49 4e 41 50 49 20 43 72 65 61 74  DLE WINAPI Creat
1480: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 48 41  eFileMappingA(HA
1490: 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59  NDLE, LPSECURITY
14a0: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
14b0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57         DWORD, DW
14c0: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 53  ORD, DWORD, LPCS
14d0: 54 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64  TR);.#endif /* d
14e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
14f0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 2a 2f  N32_HAS_ANSI) */
1500: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1510: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1520: 49 44 45 29 0a 57 49 4e 42 41 53 45 41 50 49 20  IDE).WINBASEAPI 
1530: 48 41 4e 44 4c 45 20 57 49 4e 41 50 49 20 43 72  HANDLE WINAPI Cr
1540: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
1550: 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45 43 55 52  (HANDLE, LPSECUR
1560: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20  ITY_ATTRIBUTES, 
1570: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
1580: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 4c   DWORD, DWORD, L
1590: 50 43 57 53 54 52 29 3b 0a 23 65 6e 64 69 66 20  PCWSTR);.#endif 
15a0: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
15b0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
15c0: 29 20 2a 2f 0a 0a 57 49 4e 42 41 53 45 41 50 49  ) */..WINBASEAPI
15d0: 20 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d   LPVOID WINAPI M
15e0: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 48 41 4e  apViewOfFile(HAN
15f0: 44 4c 45 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  DLE, DWORD, DWOR
1600: 44 2c 20 44 57 4f 52 44 2c 20 53 49 5a 45 5f 54  D, DWORD, SIZE_T
1610: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1620: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a  ITE_OS_WINRT */.
1630: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65  ./*.** This file
1640: 20 6d 61 70 70 69 6e 67 20 41 50 49 20 69 73 20   mapping API is 
1650: 63 6f 6d 6d 6f 6e 20 74 6f 20 62 6f 74 68 20 57  common to both W
1660: 69 6e 33 32 20 61 6e 64 20 57 69 6e 52 54 2e 0a  in32 and WinRT..
1670: 2a 2f 0a 57 49 4e 42 41 53 45 41 50 49 20 42 4f  */.WINBASEAPI BO
1680: 4f 4c 20 57 49 4e 41 50 49 20 55 6e 6d 61 70 56  OL WINAPI UnmapV
1690: 69 65 77 4f 66 46 69 6c 65 28 4c 50 43 56 4f 49  iewOfFile(LPCVOI
16a0: 44 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  D);.#endif /* SQ
16b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d  LITE_WIN32_FILEM
16c0: 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64  APPING_API && !d
16d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16e0: 49 54 5f 57 41 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_WAL) */../*.*
16f0: 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74  * Some Microsoft
1700: 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20   compilers lack 
1710: 74 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e  this definition.
1720: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41  .*/.#ifndef INVA
1730: 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1740: 54 45 53 0a 23 20 64 65 66 69 6e 65 20 49 4e 56  TES.# define INV
1750: 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1760: 55 54 45 53 20 28 28 44 57 4f 52 44 29 2d 31 29  UTES ((DWORD)-1)
1770: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1780: 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a   FILE_FLAG_MASK.
1790: 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f 46 4c  # define FILE_FL
17a0: 41 47 5f 4d 41 53 4b 20 20 20 20 20 20 20 20 20  AG_MASK         
17b0: 20 28 30 78 46 46 33 43 30 30 30 30 29 0a 23 65   (0xFF3C0000).#e
17c0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49  ndif..#ifndef FI
17d0: 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
17e0: 4b 0a 23 20 64 65 66 69 6e 65 20 46 49 4c 45 5f  K.# define FILE_
17f0: 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 20 20  ATTRIBUTE_MASK  
1800: 20 20 20 28 30 78 30 30 30 33 46 46 46 37 29 0a     (0x0003FFF7).
1810: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1830: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1840: 65 6e 63 65 73 20 74 6f 20 73 74 72 75 63 74 75  ences to structu
1850: 72 65 73 20 75 73 65 64 20 66 6f 72 20 57 41 4c  res used for WAL
1860: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1870: 63 74 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d  ct winShm winShm
1880: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
1890: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
18a0: 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a  hared-memory */.
18b0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
18c0: 69 6e 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d  inShmNode winShm
18d0: 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67  Node;   /* A reg
18e0: 69 6f 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ion of shared-me
18f0: 6d 6f 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  mory */.#endif..
1900: 2f 2a 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b  /*.** WinCE lack
1910: 73 20 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74  s native support
1920: 20 66 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e   for file lockin
1930: 67 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20  g so we have to 
1940: 66 61 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20  fake it.** with 
1950: 73 6f 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72  some code of our
1960: 20 6f 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   own..*/.#if SQL
1970: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70  ITE_OS_WINCE.typ
1980: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 63  edef struct winc
1990: 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52  eLock {.  int nR
19a0: 65 61 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a  eaders;       /*
19b0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65   Number of reade
19c0: 72 20 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  r locks obtained
19d0: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64   */.  BOOL bPend
19e0: 69 6e 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  ing;      /* Ind
19f0: 69 63 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67  icates a pending
1a00: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
1a10: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1a20: 4c 20 62 52 65 73 65 72 76 65 64 3b 20 20 20 20  L bReserved;    
1a30: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1a40: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61  reserved lock ha
1a50: 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  s been obtained 
1a60: 2a 2f 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75  */.  BOOL bExclu
1a70: 73 69 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69  sive;    /* Indi
1a80: 63 61 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69  cates an exclusi
1a90: 76 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  ve lock has been
1aa0: 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77   obtained */.} w
1ab0: 69 6e 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66  inceLock;.#endif
1ac0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46  ../*.** The winF
1ad0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ile structure is
1ae0: 20 61 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73   a subclass of s
1af0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65  qlite3_file* spe
1b00: 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e  cific to the win
1b10: 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74  32.** portabilit
1b20: 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65  y layer..*/.type
1b30: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46 69  def struct winFi
1b40: 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75  le winFile;.stru
1b50: 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63  ct winFile {.  c
1b60: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1b70: 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64  methods *pMethod
1b80: 3b 20 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66  ; /*** Must be f
1b90: 69 72 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69  irst ***/.  sqli
1ba0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1bb0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75      /* The VFS u
1bc0: 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73  sed to open this
1bd0: 20 66 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c   file */.  HANDL
1be0: 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  E h;            
1bf0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72     /* Handle for
1c00: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 66   accessing the f
1c10: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b  ile */.  u8 lock
1c20: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
1c30: 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b   /* Type of lock
1c40: 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1c50: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1c60: 20 20 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f    short sharedLo
1c70: 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e  ckByte;   /* Ran
1c80: 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74  domly chosen byt
1c90: 65 20 75 73 65 64 20 61 73 20 61 20 73 68 61 72  e used as a shar
1ca0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20  ed lock */.  u8 
1cb0: 63 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20  ctrlFlags;      
1cc0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20       /* Flags.  
1cd0: 53 65 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65  See WINFILE_* be
1ce0: 6c 6f 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  low */.  DWORD l
1cf0: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
1d00: 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
1d10: 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
1d20: 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
1d30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d40: 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68  OMIT_WAL.  winSh
1d50: 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20  m *pShm;        
1d60: 20 20 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f     /* Instance o
1d70: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
1d80: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1d90: 23 65 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63  #endif.  const c
1da0: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1db0: 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d   /* Full pathnam
1dc0: 65 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a  e of this file *
1dd0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1df0: 68 75 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67  hunk size config
1e00: 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48  ured by FCNTL_CH
1e10: 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20  UNK_SIZE */.#if 
1e20: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1e30: 20 20 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65    LPWSTR zDelete
1e40: 4f 6e 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d  OnClose;  /* Nam
1e50: 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
1e60: 65 74 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67  ete when closing
1e70: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75   */.  HANDLE hMu
1e80: 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tex;          /*
1e90: 20 4d 75 74 65 78 20 75 73 65 64 20 74 6f 20 63   Mutex used to c
1ea0: 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
1eb0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
1ec0: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1ed0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1ee0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1ef0: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
1f00: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
1f10: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
1f20: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
1f30: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
1f40: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1f50: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
1f60: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
1f70: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
1f80: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
1f90: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
1fa0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1fb0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1fc0: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1fe0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
1ff0: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 65  ding xFetch refe
2000: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44  rences */.  HAND
2010: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
2020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
2030: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
2040: 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  g memory mapping
2050: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70   */.  void *pMap
2060: 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
2070: 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f      /* Area memo
2080: 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73  ry mapped */.  s
2090: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
20a0: 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  pSize;       /* 
20b0: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
20c0: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
20d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
20e0: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
20f0: 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f  /* Actual size o
2100: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
2110: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
2120: 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20  64 mmapSizeMax; 
2130: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
2140: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
2150: 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
2160: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
2170: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
2180: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
2190: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
21a0: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20  LE_RDONLY       
21b0: 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e     0x02   /* Con
21c0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
21d0: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
21e0: 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
21f0: 57 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f  WAL     0x04   /
2200: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
2210: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
2220: 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20   WINFILE_PSOW   
2230: 20 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20           0x10   
2240: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
2250: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2260: 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68  ITE */../*. * Th
2270: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
2280: 66 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c  ffer used by sql
2290: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
22a0: 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69  _debug().. */.#i
22b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
22c0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a  32_DBG_BUF_SIZE.
22d0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
22e0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
22f0: 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39  IZE   ((int)(409
2300: 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  6-sizeof(DWORD))
2310: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2320: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
2330: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
2340: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
2350: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
2360: 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69  t. * the data di
2370: 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62  rectory should b
2380: 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23  e changed.. */.#
2390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
23a0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
23b0: 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e  RY_TYPE.#  defin
23c0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  e SQLITE_WIN32_D
23d0: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
23e0: 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  PE (1).#endif../
23f0: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75  *. * The value u
2400: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
2410: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
2420: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66  tory() to specif
2430: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65  y that. * the te
2440: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
2450: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
2460: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
2470: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45   SQLITE_WIN32_TE
2480: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
2490: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
24a0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
24b0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29  RECTORY_TYPE (2)
24c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
24d0: 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  f compiled with 
24e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
24f0: 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  LOC on Windows, 
2500: 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a  we will use the.
2510: 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32   * various Win32
2520: 20 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69   API heap functi
2530: 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ons instead of o
2540: 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64  ur own.. */.#ifd
2550: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2560: 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66  MALLOC../*. * If
2570: 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72   this is non-zer
2580: 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  o, an isolated h
2590: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
25a0: 74 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76  ted by the nativ
25b0: 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63  e Win32. * alloc
25c0: 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20  ator subsystem; 
25d0: 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64  otherwise, the d
25e0: 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68  efault process h
25f0: 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64  eap will be used
2600: 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69  .  This. * setti
2610: 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ng has no effect
2620: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
2630: 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64  for WinRT.  By d
2640: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20  efault, this is 
2650: 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61  enabled. * and a
2660: 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  n isolated heap 
2670: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
2680: 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c  to store all all
2690: 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a  ocated data.. *.
26a0: 20 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 2a 2a 0a  ***************.
26f0: 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69   * WARNING: It i
2700: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
2710: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
2720: 69 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f  is setting is no
2730: 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20  n-zero and the. 
2740: 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65  *          winMe
2750: 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69  mShutdown functi
2760: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e  on is called (e.
2770: 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  g. by the sqlite
2780: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20  3_shutdown. *   
2790: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29         function)
27a0: 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20  , all data that 
27b0: 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  was allocated us
27c0: 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64  ing the isolated
27d0: 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20   heap will. *   
27e0: 20 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20         be freed 
27f0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
2800: 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61  any attempt to a
2810: 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61  ccess any of tha
2820: 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20  t freed. *      
2830: 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c      data will al
2840: 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72  most certainly r
2850: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65  esult in an imme
2860: 64 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f  diate access vio
2870: 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a  lation.. *******
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 2a 2a 0a 20 2a 2f 0a 23 69 66 6e  *******. */.#ifn
28d0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
28e0: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20  _HEAP_CREATE.#  
28f0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2900: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20  N32_HEAP_CREATE 
2910: 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66     (TRUE).#endif
2920: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74  ../*. * The init
2930: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
2940: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2950: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
2960: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
2970: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2980: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
2990: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
29a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
29b0: 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51  P_INIT_SIZE ((SQ
29c0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
29d0: 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20  HE_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 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
2a10: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b  ULT_PAGE_SIZE) +
2a20: 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66   4194304).#endif
2a30: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69  ../*. * The maxi
2a40: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
2a50: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
2a60: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
2a70: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
2a80: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2a90: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2aa0: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
2ab0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2ac0: 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23  _MAX_SIZE  (0).#
2ad0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
2ae0: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
2af0: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
2b00: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
2b10: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
2b20: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
2b30: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2b40: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
2b50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
2b60: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
2b70: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2b80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
2b90: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
2ba0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65  ./*.** The winMe
2bb0: 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  mData structure 
2bc0: 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69  stores informati
2bd0: 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74  on required by t
2be0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
2bf0: 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d  c.** sqlite3_mem
2c00: 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65  _methods impleme
2c10: 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65  ntation..*/.type
2c20: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65  def struct winMe
2c30: 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61  mData winMemData
2c40: 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  ;.struct winMemD
2c50: 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  ata {.#ifndef ND
2c60: 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63  EBUG.  u32 magic
2c70: 31 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75  1;   /* Magic nu
2c80: 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73  mber to detect s
2c90: 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
2ca0: 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ion. */.#endif. 
2cb0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f   HANDLE hHeap; /
2cc0: 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20  * The handle to 
2cd0: 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42  our heap. */.  B
2ce0: 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20  OOL bOwned;  /* 
2cf0: 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65  Do we own the he
2d00: 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79  ap (i.e. destroy
2d10: 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29   it on shutdown)
2d20: 3f 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ? */.#ifndef NDE
2d30: 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 32  BUG.  u32 magic2
2d40: 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d  ;   /* Magic num
2d50: 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74  ber to detect st
2d60: 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69  ructure corrupti
2d70: 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  on. */.#endif.};
2d80: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
2d90: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f  .#define WINMEM_
2da0: 4d 41 47 49 43 31 20 20 20 20 20 30 78 34 32 62  MAGIC1     0x42b
2db0: 32 38 33 30 62 0a 23 64 65 66 69 6e 65 20 57 49  2830b.#define WI
2dc0: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20 20 20  NMEM_MAGIC2     
2dd0: 30 78 62 64 34 64 37 63 66 34 0a 23 65 6e 64 69  0xbd4d7cf4.#endi
2de0: 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  f..static struct
2df0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f   winMemData win_
2e00: 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66  mem_data = {.#if
2e10: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49  ndef NDEBUG.  WI
2e20: 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e  NMEM_MAGIC1,.#en
2e30: 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53  dif.  NULL, FALS
2e40: 45 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  E.#ifndef NDEBUG
2e50: 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  .  ,WINMEM_MAGIC
2e60: 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66  2.#endif.};..#if
2e70: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
2e80: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
2e90: 4d 61 67 69 63 31 28 29 20 61 73 73 65 72 74 28  Magic1() assert(
2ea0: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61   win_mem_data.ma
2eb0: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
2ec0: 49 43 31 20 29 0a 23 64 65 66 69 6e 65 20 77 69  IC1 ).#define wi
2ed0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32  nMemAssertMagic2
2ee0: 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d  () assert( win_m
2ef0: 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d  em_data.magic2==
2f00: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a  WINMEM_MAGIC2 ).
2f10: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
2f20: 73 65 72 74 4d 61 67 69 63 28 29 20 20 77 69 6e  sertMagic()  win
2f30: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28  MemAssertMagic1(
2f40: 29 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ); winMemAssertM
2f50: 61 67 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23  agic2();.#else.#
2f60: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
2f70: 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69  ertMagic().#endi
2f80: 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  f..#define winMe
2f90: 6d 47 65 74 44 61 74 61 50 74 72 28 29 20 20 26  mGetDataPtr()  &
2fa0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65  win_mem_data.#de
2fb0: 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65  fine winMemGetHe
2fc0: 61 70 28 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d  ap()     win_mem
2fd0: 5f 64 61 74 61 2e 68 48 65 61 70 0a 23 64 65 66  _data.hHeap.#def
2fe0: 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e  ine winMemGetOwn
2ff0: 65 64 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f  ed()    win_mem_
3000: 64 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61  data.bOwned..sta
3010: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
3020: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
3030: 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  s);.static void 
3040: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
3050: 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63  *pPrior);.static
3060: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61   void *winMemRea
3070: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f  lloc(void *pPrio
3080: 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  r, int nBytes);.
3090: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
30a0: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a  mSize(void *p);.
30b0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
30c0: 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b  mRoundup(int n);
30d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
30e0: 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70  emInit(void *pAp
30f0: 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76  pData);.static v
3100: 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f  oid winMemShutdo
3110: 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  wn(void *pAppDat
3120: 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74  a);..const sqlit
3130: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
3140: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
3150: 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66  32(void);.#endif
3160: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
3170: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
3180: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3190: 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72  variable is (nor
31a0: 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20  mally) set once 
31b0: 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65  and never change
31c0: 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e  s.** thereafter.
31d0: 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65    It records whe
31e0: 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  ther the operati
31f0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
3200: 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a  9x.** or WinNT..
3210: 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61  **.** 0:   Opera
3220: 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e  ting system unkn
3230: 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65  own..** 1:   Ope
3240: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
3250: 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20   Win9x..** 2:   
3260: 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  Operating system
3270: 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   is WinNT..**.**
3280: 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63   In order to fac
3290: 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20  ilitate testing 
32a0: 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65  on a WinNT syste
32b0: 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74  m, the test fixt
32c0: 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61  ure.** can manua
32d0: 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c  lly set this val
32e0: 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61  ue to 1 to emula
32f0: 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f  te Win98 behavio
3300: 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
3310: 49 54 45 5f 54 45 53 54 0a 4c 4f 4e 47 20 76 6f  ITE_TEST.LONG vo
3320: 6c 61 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f  latile sqlite3_o
3330: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73  s_type = 0;.#els
3340: 65 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 76 6f  e.static LONG vo
3350: 6c 61 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f  latile sqlite3_o
3360: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64  s_type = 0;.#end
3370: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43  if..#ifndef SYSC
3380: 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59  ALL.#  define SY
3390: 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79  SCALL sqlite3_sy
33a0: 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66  scall_ptr.#endif
33b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
33c0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61  ction is not ava
33d0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
33e0: 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20  s CE or WinRT.. 
33f0: 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
3400: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
3410: 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65  E_OS_WINRT.#  de
3420: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
3430: 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 20 31  isANSI()       1
3440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
3450: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
3460: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
3470: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
3480: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
3490: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
34a0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
34b0: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
34c0: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
34d0: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
34e0: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
34f0: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
3500: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
3510: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
3520: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
3530: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
3540: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
3550: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
3560: 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  win_syscall {.  
3570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3590: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   Name of the sys
35a0: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
35b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
35c0: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
35d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
35e0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
35f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
3600: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
3610: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
3620: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
3630: 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c  l[] = {.#if !SQL
3640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3650: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3660: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
3670: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
3680: 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65  (SYSCALL)AreFile
3690: 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20  ApisANSI,       
36a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
36b0: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
36c0: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
36d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
36f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
3700: 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ef osAreFileApis
3710: 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41  ANSI.#define osA
3720: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28  reFileApisANSI (
3730: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56  (BOOL(WINAPI*)(V
3740: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  OID))aSyscall[0]
3750: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
3760: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
3770: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
3780: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3790: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
37a0: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
37b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
37c0: 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20  )CharLowerW,    
37d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
37e0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f  else.  { "CharLo
37f0: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
3800: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3830: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
3840: 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52  rLowerW ((LPWSTR
3850: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
3860: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
3870: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
3880: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3890: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
38a0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
38b0: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
38d0: 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72  YSCALL)CharUpper
38e0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
38f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3900: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
3910: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3920: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3930: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3940: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3950: 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28   osCharUpperW ((
3960: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
3970: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
3980: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
3990: 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22   { "CloseHandle"
39a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
39b0: 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64  YSCALL)CloseHand
39c0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
39d0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
39e0: 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f  CloseHandle ((BO
39f0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
3a00: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  LE))aSyscall[3].
3a10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3a30: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3a40: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3a60: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
3a70: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
3a80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
3a90: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
3aa0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3ab0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3ac0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3ad0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3ae0: 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28  osCreateFileA ((
3af0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
3b00: 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  LPCSTR,DWORD,DWO
3b10: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
3b20: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
3b30: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
3b40: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
3b50: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [4].pCurrent)..#
3b60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
3b70: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3b80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3b90: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
3ba0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
3bb0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
3bc0: 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  eateFileW,      
3bd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3be0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
3bf0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
3c00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3c30: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3c40: 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57  FileW ((HANDLE(W
3c50: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
3c60: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
3c70: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
3c80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f  Y_ATTRIBUTES,DWO
3c90: 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29  RD,DWORD,HANDLE)
3ca0: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
3cb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51  rrent)..#if (!SQ
3cc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3cd0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3ce0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
3cf0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
3d00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3d10: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
3d20: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
3d30: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3d40: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3d50: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
3d60: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3d70: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
3d80: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3db0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3dc0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28  teFileMappingA (
3dd0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3de0: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
3df0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3e00: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
3e10: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54  WORD,DWORD,LPCST
3e20: 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  R))aSyscall[6].p
3e30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3e40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3e50: 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e   (!SQLITE_OS_WIN
3e60: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3e70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3e80: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
3e90: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
3ea0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b  E_OMIT_WAL)).  {
3eb0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
3ec0: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
3ed0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
3ee0: 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20  appingW,      0 
3ef0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3f00: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3f10: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3f20: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3f30: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3f40: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3f50: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
3f60: 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngW ((HANDLE(WIN
3f70: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
3f80: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
3f90: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
3fa0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
3fb0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3fc0: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
3fd0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3fe0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3ff0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4000: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61  _WIDE).  { "Crea
4010: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
4020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
4030: 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20  reateMutexW,    
4040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4050: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  se.  { "CreateMu
4060: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
4070: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
40a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
40b0: 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45  eMutexW ((HANDLE
40c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55  (WINAPI*)(LPSECU
40d0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
40e0: 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20  BOOL, \.        
40f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4100: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
4110: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4120: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4130: 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  I).  { "DeleteFi
4140: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
4150: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
4160: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
4170: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4180: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
4190: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
41a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
41d0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
41e0: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
41f0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
4200: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
4210: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
4220: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4230: 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65  IDE).  { "Delete
4240: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
4250: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c      (SYSCALL)Del
4260: 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  eteFileW,       
4270: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4280: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
4290: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
42a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
42d0: 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46  define osDeleteF
42e0: 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ileW ((BOOL(WINA
42f0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
4300: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
4310: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4320: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
4330: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
4340: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
4350: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  L)FileTimeToLoca
4360: 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  lFileTime, 0 },.
4370: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
4380: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
4390: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
43c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
43d0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
43e0: 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eTime ((BOOL(WIN
43f0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
4400: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
4410: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
4420: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
4430: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
4440: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
4450: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
4460: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
4470: 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  )FileTimeToSyste
4480: 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23  mTime,    0 },.#
4490: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
44a0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
44b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
44e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
44f0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
4500: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4510: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
4520: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  *, \.        LPS
4530: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
4540: 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74  all[12].pCurrent
4550: 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c  )..  { "FlushFil
4560: 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20  eBuffers",      
4570: 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68    (SYSCALL)Flush
4580: 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20  FileBuffers,    
4590: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
45a0: 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  e osFlushFileBuf
45b0: 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41  fers ((BOOL(WINA
45c0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
45d0: 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65  scall[13].pCurre
45e0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
45f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4600: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72  S_ANSI).  { "For
4610: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
4620: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4630: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20  FormatMessageA, 
4640: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4650: 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  lse.  { "FormatM
4660: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
4670: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
46a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d  ..#define osForm
46b0: 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f  atMessageA ((DWO
46c0: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
46d0: 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  D,LPCVOID,DWORD,
46e0: 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20  DWORD,LPSTR, \. 
46f0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f         DWORD,va_
4700: 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  list*))aSyscall[
4710: 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  14].pCurrent)..#
4720: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4730: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4740: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
4750: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
4760: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
4770: 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20  MessageW,       
4780: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4790: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
47a0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
47b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
47d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
47e0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
47f0: 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ageW ((DWORD(WIN
4800: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
4810: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
4820: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
4830: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
4840: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
4850: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
4860: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4870: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
4880: 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72  N).  { "FreeLibr
4890: 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ary",           
48a0: 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c    (SYSCALL)FreeL
48b0: 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20  ibrary,         
48c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
48d0: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
48e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
48f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4920: 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61  fine osFreeLibra
4930: 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  ry ((BOOL(WINAPI
4940: 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73  *)(HMODULE))aSys
4950: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
4960: 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72  t)..  { "GetCurr
4970: 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20  entProcessId",  
4980: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43     (SYSCALL)GetC
4990: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c  urrentProcessId,
49a0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
49b0: 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ne osGetCurrentP
49c0: 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44  rocessId ((DWORD
49d0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
49e0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
49f0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4a00: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
4a10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4a20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4a30: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
4a40: 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53  paceA",       (S
4a50: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
4a60: 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20  eeSpaceA,       
4a70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4a80: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4a90: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
4aa0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4ac0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4ad0: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
4ae0: 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceA ((BOOL(WINA
4af0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57  PI*)(LPCSTR,LPDW
4b00: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  ORD,LPDWORD,LPDW
4b10: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
4b20: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
4b30: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
4b40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4b50: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
4b60: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4b70: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4b80: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4b90: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4ba0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
4bb0: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
4bc0: 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceW,       0 },
4bd0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
4be0: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
4bf0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4c00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4c10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4c20: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4c30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
4c40: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4c50: 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44  (LPCWSTR,LPDWORD
4c60: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
4c70: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57  , \.        LPDW
4c80: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39  ORD))aSyscall[19
4c90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4ca0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4cb0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4cc0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4cd0: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
4ce0: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
4cf0: 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20  ttributesA,     
4d00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4d10: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
4d20: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
4d30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4d50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4d60: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
4d70: 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57  butesA ((DWORD(W
4d80: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
4d90: 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75  aSyscall[20].pCu
4da0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4db0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4dc0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4dd0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4de0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4df0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
4e00: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4e10: 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20  tributesW,      
4e20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4e30: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4e40: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
4e50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4e70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4e80: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4e90: 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49  utesW ((DWORD(WI
4ea0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
4eb0: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
4ec0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4ed0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4ee0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4ef0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4f00: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
4f10: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4f20: 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c  utesExW,    0 },
4f30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4f40: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4f50: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
4f60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4f70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4f80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4f90: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4fa0: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
4fb0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f  I*)(LPCWSTR,GET_
4fc0: 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45  FILEEX_INFO_LEVE
4fd0: 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LS, \.        LP
4fe0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
4ff0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5000: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5010: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53  RT.  { "GetFileS
5020: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
5030: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
5040: 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
5050: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5060: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
5070: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
5080: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
50b0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69  fine osGetFileSi
50c0: 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  ze ((DWORD(WINAP
50d0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f  I*)(HANDLE,LPDWO
50e0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  RD))aSyscall[23]
50f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5100: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
5110: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5120: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
5130: 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  I).  { "GetFullP
5140: 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20  athNameA",      
5150: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
5160: 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20  llPathNameA,    
5170: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5180: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
5190: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
51a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
51d0: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
51e0: 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28  thNameA ((DWORD(
51f0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
5200: 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20  DWORD,LPSTR, \. 
5210: 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61         LPSTR*))a
5220: 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72  Syscall[24].pCur
5230: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5240: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
5250: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
5260: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5270: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
5280: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
5290: 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20  thNameW",       
52a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
52b0: 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20  lPathNameW,     
52c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
52d0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
52e0: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
52f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5310: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5320: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
5330: 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57  hNameW ((DWORD(W
5340: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
5350: 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a  DWORD,LPWSTR, \.
5360: 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29          LPWSTR*)
5370: 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43  )aSyscall[25].pC
5380: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
5390: 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20  tLastError",    
53a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
53b0: 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  )GetLastError,  
53c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
53d0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73  #define osGetLas
53e0: 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57  tError ((DWORD(W
53f0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
5400: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
5410: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
5420: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
5430: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23  OAD_EXTENSION).#
5440: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
5450: 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50  CE.  /* The GetP
5460: 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f  rocAddressA() ro
5470: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76  utine is only av
5480: 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f  ailable on Windo
5490: 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47  ws CE. */.  { "G
54a0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
54b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
54c0: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
54d0: 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  A,         0 },.
54e0: 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f  #else.  /* All o
54f0: 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61  ther Windows pla
5500: 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65  tforms expect Ge
5510: 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74  tProcAddress() t
5520: 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41  o take.  ** an A
5530: 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72  NSI string regar
5540: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e  dless of the _UN
5550: 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f  ICODE setting */
5560: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64  .  { "GetProcAdd
5570: 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20  ressA",         
5580: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
5590: 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20  Address,        
55a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65    0 },.#endif.#e
55b0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  lse.  { "GetProc
55c0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
55d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5600: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
5610: 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41  rocAddressA ((FA
5620: 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48  RPROC(WINAPI*)(H
5630: 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20  MODULE, \.      
5640: 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61    LPCSTR))aSysca
5650: 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[27].pCurrent)
5660: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5670: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53  _WINRT.  { "GetS
5680: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
5690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
56a0: 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  etSystemInfo,   
56b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
56c0: 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  se.  { "GetSyste
56d0: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
56e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5710: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
5720: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
5730: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
5740: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
5750: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [28].pCurrent)..
5760: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
5770: 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  me",           (
5780: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
5790: 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  mTime,          
57a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
57b0: 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28  sGetSystemTime (
57c0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
57d0: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79  PSYSTEMTIME))aSy
57e0: 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65  scall[29].pCurre
57f0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5800: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47  _OS_WINCE.  { "G
5810: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5820: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
5830: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  L)GetSystemTimeA
5840: 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  sFileTime, 0 },.
5850: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79  #else.  { "GetSy
5860: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
5870: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
58a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
58b0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
58c0: 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  eTime ((VOID(WIN
58d0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
58e0: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
58f0: 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65  scall[30].pCurre
5900: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5910: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5920: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
5930: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
5940: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5950: 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20  GetTempPathA,   
5960: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5970: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  lse.  { "GetTemp
5980: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
5990: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
59c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
59d0: 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44  empPathA ((DWORD
59e0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
59f0: 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  LPSTR))aSyscall[
5a00: 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  31].pCurrent)..#
5a10: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5a20: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
5a30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5a40: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
5a50: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
5a60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5a70: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
5a80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5a90: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
5aa0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
5ab0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5ae0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
5af0: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
5b00: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
5b10: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
5b20: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
5b30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5b40: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
5b50: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
5b60: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
5b70: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
5b80: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5b90: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
5ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5bb0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5be0: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
5bf0: 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41  unt ((DWORD(WINA
5c00: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
5c10: 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74  all[33].pCurrent
5c20: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
5c30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5c40: 41 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64  ANSI) && defined
5c50: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
5c60: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 5c  TVERSIONEX) && \
5c70: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
5c80: 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e  WIN32_GETVERSION
5c90: 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  EX.  { "GetVersi
5ca0: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5cb0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65    (SYSCALL)GetVe
5cc0: 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20  rsionExA,       
5cd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5ce0: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
5cf0: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
5d00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5d30: 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f  fine osGetVersio
5d40: 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  nExA ((BOOL(WINA
5d50: 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20  PI*)( \.        
5d60: 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41  LPOSVERSIONINFOA
5d70: 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70  ))aSyscall[34].p
5d80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5d90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5da0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5db0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5dc0: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 64 65   && \.        de
5dd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5de0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29  32_GETVERSIONEX)
5df0: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
5e00: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
5e10: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57  { "GetVersionExW
5e20: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5e30: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
5e40: 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExW,           0
5e50: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5e60: 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20  etVersionExW",  
5e70: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5e80: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5e90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5ea0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5eb0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20  osGetVersionExW 
5ec0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5ed0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
5ee0: 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79  ERSIONINFOW))aSy
5ef0: 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65  scall[35].pCurre
5f00: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c  nt)..  { "HeapAl
5f10: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
5f20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5f30: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  pAlloc,         
5f40: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5f50: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20  ine osHeapAlloc 
5f60: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
5f70: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
5f80: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
5f90: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
5fa0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5fb0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5fc0: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5fe0: 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74  YSCALL)HeapCreat
5ff0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
6000: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6010: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
6020: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6030: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6040: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6050: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6060: 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28   osHeapCreate ((
6070: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
6080: 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a  DWORD,SIZE_T, \.
6090: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
60a0: 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75  aSyscall[37].pCu
60b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
60c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
60d0: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
60f0: 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79  CALL)HeapDestroy
6100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
6110: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
6120: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
6130: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6140: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6150: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6160: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6170: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42  sHeapDestroy ((B
6180: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6190: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38  DLE))aSyscall[38
61a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
61b0: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20   "HeapFree",    
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
61d0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20  CALL)HeapFree,  
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
61f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6200: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49  apFree ((BOOL(WI
6210: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6220: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73  ORD,LPVOID))aSys
6230: 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e  call[39].pCurren
6240: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41  t)..  { "HeapReA
6250: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
6260: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6270: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  ReAlloc,        
6280: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6290: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63  ne osHeapReAlloc
62a0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
62b0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
62c0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20  LPVOID, \.      
62d0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
62e0: 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[40].pCurrent)
62f0: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22  ..  { "HeapSize"
6300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6310: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69   (SYSCALL)HeapSi
6320: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
6330: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6340: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49   osHeapSize ((SI
6350: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41  ZE_T(WINAPI*)(HA
6360: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
6370: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
6380: 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72  Syscall[41].pCur
6390: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
63a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
63b0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
63c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
63d0: 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65  ALL)HeapValidate
63e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
63f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
6400: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
6410: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6420: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6430: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6440: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6450: 48 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42  HeapValidate ((B
6460: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6470: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
6480: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
6490: 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72  yscall[42].pCurr
64a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
64b0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
64c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
64d0: 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22   { "HeapCompact"
64e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
64f0: 59 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61  YSCALL)HeapCompa
6500: 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ct,             
6510: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6520: 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20  HeapCompact",   
6530: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6540: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6550: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6560: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6570: 20 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28   osHeapCompact (
6580: 28 55 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48  (UINT(WINAPI*)(H
6590: 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79  ANDLE,DWORD))aSy
65a0: 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65  scall[43].pCurre
65b0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
65c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
65d0: 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66 69  S_ANSI) && !defi
65e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
65f0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
6600: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
6610: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
6620: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
6630: 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20 20  aryA,           
6640: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6650: 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20  "LoadLibraryA", 
6660: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6670: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6690: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
66a0: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41  e osLoadLibraryA
66b0: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
66c0: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
66d0: 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e  call[44].pCurren
66e0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
66f0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
6700: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
6710: 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a  _HAS_WIDE) && \.
6720: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
6730: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
6740: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b  D_EXTENSION).  {
6750: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
6760: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6770: 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79  CALL)LoadLibrary
6780: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  W,            0 
6790: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
67a0: 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20  adLibraryW",    
67b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
67c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
67d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
67e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
67f0: 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28  sLoadLibraryW ((
6800: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
6810: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
6820: 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[45].pCurrent)
6830: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6840: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61  _WINRT.  { "Loca
6850: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
6860: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
6870: 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20  ocalFree,       
6880: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6890: 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65  se.  { "LocalFre
68a0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
68b0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
68e0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c  .#define osLocal
68f0: 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49  Free ((HLOCAL(WI
6900: 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61  NAPI*)(HLOCAL))a
6910: 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72  Syscall[46].pCur
6920: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6930: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
6940: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6950: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6970: 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65  SYSCALL)LockFile
6980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6990: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
69a0: 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  "LockFile",     
69b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
69c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
69e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
69f0: 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65  f osLockFile.#de
6a00: 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20  fine osLockFile 
6a10: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6a20: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
6a30: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
6a40: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
6a50: 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74  all[47].pCurrent
6a60: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ).#endif..#if !S
6a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
6a80: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
6a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6aa0: 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45  YSCALL)LockFileE
6ab0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
6ac0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6ad0: 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  LockFileEx",    
6ae0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6af0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6b10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6b20: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64   osLockFileEx.#d
6b30: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
6b40: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
6b50: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6b60: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6b70: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
6b80: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
6b90: 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74  all[48].pCurrent
6ba0: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ).#endif..#if SQ
6bb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
6bc0: 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e   (!SQLITE_OS_WIN
6bd0: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
6be0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29  QLITE_OMIT_WAL))
6bf0: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6c00: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6c10: 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77  (SYSCALL)MapView
6c20: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  OfFile,         
6c30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6c40: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22   "MapViewOfFile"
6c50: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
6c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6c80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6c90: 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  ne osMapViewOfFi
6ca0: 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  le ((LPVOID(WINA
6cb0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6cc0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
6cd0: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
6ce0: 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43  )aSyscall[49].pC
6cf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75  urrent)..  { "Mu
6d00: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
6d10: 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  r",     (SYSCALL
6d20: 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  )MultiByteToWide
6d30: 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a  Char,     0 },..
6d40: 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42  #define osMultiB
6d50: 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28 28  yteToWideChar ((
6d60: 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e  int(WINAPI*)(UIN
6d70: 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69  T,DWORD,LPCSTR,i
6d80: 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20  nt,LPWSTR, \.   
6d90: 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63 61       int))aSysca
6da0: 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[50].pCurrent)
6db0: 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72 66  ..  { "QueryPerf
6dc0: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c  ormanceCounter",
6dd0: 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50   (SYSCALL)QueryP
6de0: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
6df0: 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65  r, 0 },..#define
6e00: 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61   osQueryPerforma
6e10: 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f  nceCounter ((BOO
6e20: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
6e30: 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45        LARGE_INTE
6e40: 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  GER*))aSyscall[5
6e50: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
6e60: 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20  { "ReadFile",   
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6e80: 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20  SCALL)ReadFile, 
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6ea0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52   },..#define osR
6eb0: 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  eadFile ((BOOL(W
6ec0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
6ed0: 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  PVOID,DWORD,LPDW
6ee0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
6ef0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
6f00: 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65  scall[52].pCurre
6f10: 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64  nt)..  { "SetEnd
6f20: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
6f30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
6f40: 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  EndOfFile,      
6f50: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6f60: 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69  ine osSetEndOfFi
6f70: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6f80: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
6f90: 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74  all[53].pCurrent
6fa0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6fb0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74  S_WINRT.  { "Set
6fc0: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
6fd0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6fe0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20  SetFilePointer, 
6ff0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7000: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
7010: 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20  Pointer",       
7020: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7050: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
7060: 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f  ilePointer ((DWO
7070: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
7080: 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c  LE,LONG,PLONG, \
7090: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
70a0: 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75  aSyscall[54].pCu
70b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
70c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
70d0: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
70f0: 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20  CALL)Sleep,     
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7110: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c  },.#else.  { "Sl
7120: 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  eep",           
7130: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7140: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7150: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7160: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7170: 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49  sSleep ((VOID(WI
7180: 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53  NAPI*)(DWORD))aS
7190: 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72  yscall[55].pCurr
71a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65  ent)..  { "Syste
71b0: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22  mTimeToFileTime"
71c0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79  ,    (SYSCALL)Sy
71d0: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
71e0: 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65  me,    0 },..#de
71f0: 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d  fine osSystemTim
7200: 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f  eToFileTime ((BO
7210: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
7220: 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c  T SYSTEMTIME*, \
7230: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
7240: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36  IME))aSyscall[56
7250: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7260: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7270: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
7280: 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63  WINRT.  { "Unloc
7290: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
72a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
72b0: 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  lockFile,       
72c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
72d0: 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  e.  { "UnlockFil
72e0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
72f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7320: 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b  #ifndef osUnlock
7330: 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55  File.#define osU
7340: 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c  nlockFile ((BOOL
7350: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7360: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
7370: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  RD, \.        DW
7380: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  ORD))aSyscall[57
7390: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
73a0: 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
73b0: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e  OS_WINCE.  { "Un
73c0: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
73d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
73e0: 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20  )UnlockFileEx,  
73f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7400: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
7410: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
7420: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7450: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  f..#define osUnl
7460: 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c  ockFileEx ((BOOL
7470: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7480: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
7490: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
74a0: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
74b0: 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e  call[58].pCurren
74c0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
74d0: 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69  S_WINCE || !defi
74e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
74f0: 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70 56  WAL).  { "UnmapV
7500: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
7510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d      (SYSCALL)Unm
7520: 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20  apViewOfFile,   
7530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7540: 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f  .  { "UnmapViewO
7550: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
7560: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7590: 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69  define osUnmapVi
75a0: 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ewOfFile ((BOOL(
75b0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44  WINAPI*)(LPCVOID
75c0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70  ))aSyscall[59].p
75d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
75e0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
75f0: 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  te",     (SYSCAL
7600: 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  L)WideCharToMult
7610: 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a  iByte,     0 },.
7620: 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43  .#define osWideC
7630: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28  harToMultiByte (
7640: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
7650: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  NT,DWORD,LPCWSTR
7660: 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20  ,int,LPSTR,int, 
7670: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
7680: 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c  ,LPBOOL))aSyscal
7690: 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[60].pCurrent).
76a0: 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22  .  { "WriteFile"
76b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
76c0: 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69  (SYSCALL)WriteFi
76d0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
76e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
76f0: 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f  osWriteFile ((BO
7700: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7710: 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  LE,LPCVOID,DWORD
7720: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
7730: 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44      LPOVERLAPPED
7740: 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70  ))aSyscall[61].p
7750: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7760: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7770: 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78  { "CreateEventEx
7780: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
7790: 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e  SCALL)CreateEven
77a0: 74 45 78 57 2c 20 20 20 20 20 20 20 20 20 20 30  tExW,          0
77b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
77c0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20  reateEventExW", 
77d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
77e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
77f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7800: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7810: 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  osCreateEventExW
7820: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
7830: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
7840: 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52  TRIBUTES,LPCWSTR
7850: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7860: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
7870: 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[62].pCurrent).
7880: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
7890: 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46  WINRT.  { "WaitF
78a0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c  orSingleObject",
78b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61       (SYSCALL)Wa
78c0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
78d0: 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  t,     0 },.#els
78e0: 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  e.  { "WaitForSi
78f0: 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20  ngleObject",    
7900: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7920: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7930: 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f  #define osWaitFo
7940: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28  rSingleObject ((
7950: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
7960: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
7970: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
7980: 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [63].pCurrent)..
7990: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
79a0: 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NRT.  { "WaitFor
79b0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
79c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
79d0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
79e0: 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  x,   0 },.#else.
79f0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7a00: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7a10: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7a40: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
7a50: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28  ingleObjectEx ((
7a60: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
7a70: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
7a80: 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79         BOOL))aSy
7a90: 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65  scall[64].pCurre
7aa0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7ab0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
7ac0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
7ad0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7ae0: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  )SetFilePointerE
7af0: 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  x,        0 },.#
7b00: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7b10: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7b20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7b50: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7b60: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28  FilePointerEx ((
7b70: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
7b80: 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47  NDLE,LARGE_INTEG
7b90: 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c  ER, \.        PL
7ba0: 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f  ARGE_INTEGER,DWO
7bb0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  RD))aSyscall[65]
7bc0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7bd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7be0: 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f    { "GetFileInfo
7bf0: 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45  rmationByHandleE
7c00: 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  x", (SYSCALL)Get
7c10: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7c20: 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a  yHandleEx, 0 },.
7c30: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
7c40: 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
7c50: 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41  andleEx", (SYSCA
7c60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7c70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7c80: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
7c90: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
7ca0: 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f  ByHandleEx ((BOO
7cb0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7cc0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c  E, \.        FIL
7cd0: 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45  E_INFO_BY_HANDLE
7ce0: 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57  _CLASS,LPVOID,DW
7cf0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36  ORD))aSyscall[66
7d00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7d10: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
7d20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
7d30: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20  ITE_OMIT_WAL).  
7d40: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7d50: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
7d60: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
7d70: 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30  ileFromApp,    0
7d80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d   },.#else.  { "M
7d90: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
7da0: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
7db0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7dc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7dd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7de0: 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
7df0: 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28  romApp ((LPVOID(
7e00: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7e10: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c  ULONG,ULONG64, \
7e20: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
7e30: 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43  )aSyscall[67].pC
7e40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7e50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
7e60: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7e80: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32  CALL)CreateFile2
7e90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
7ea0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
7eb0: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
7ec0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7ed0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7ee0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7ef0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7f00: 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48  sCreateFile2 ((H
7f10: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
7f20: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
7f30: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
7f40: 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45      LPCREATEFILE
7f50: 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
7f60: 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b  ETERS))aSyscall[
7f70: 36 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  68].pCurrent)..#
7f80: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7f90: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
7fa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
7fb0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
7fc0: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
7fd0: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
7fe0: 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  LL)LoadPackagedL
7ff0: 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c  ibrary,     0 },
8000: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
8010: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
8020: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8030: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8050: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
8060: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
8070: 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  ry ((HMODULE(WIN
8080: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c  API*)(LPCWSTR, \
8090: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
80a0: 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75  aSyscall[69].pCu
80b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
80c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
80d0: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
80e0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
80f0: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
8100: 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  64,          0 }
8110: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
8120: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
8130: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8140: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8150: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8160: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8170: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28  GetTickCount64 (
8180: 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50  (ULONGLONG(WINAP
8190: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
81a0: 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[70].pCurrent)
81b0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
81c0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61  WINRT.  { "GetNa
81d0: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
81e0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
81f0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
8200: 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  o,     0 },.#els
8210: 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  e.  { "GetNative
8220: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
8230: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8260: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74  #define osGetNat
8270: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  iveSystemInfo ((
8280: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
8290: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
82a0: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
82b0: 5b 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [71].pCurrent)..
82c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
82d0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
82e0: 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  I).  { "OutputDe
82f0: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
8300: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
8310: 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20  tDebugStringA,  
8320: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8330: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8340: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
8350: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8380: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
8390: 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44  ugStringA ((VOID
83a0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
83b0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70  ))aSyscall[72].p
83c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
83d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
83e0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
83f0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
8400: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
8410: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
8420: 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20  StringW,      0 
8430: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
8440: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
8450: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8460: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8470: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8480: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8490: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
84a0: 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngW ((VOID(WINAP
84b0: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
84c0: 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65  scall[73].pCurre
84d0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f  nt)..  { "GetPro
84e0: 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20  cessHeap",      
84f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8500: 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20  ProcessHeap,    
8510: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
8520: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73  ine osGetProcess
8530: 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49  Heap ((HANDLE(WI
8540: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
8550: 73 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65  scall[74].pCurre
8560: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
8570: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
8580: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
8590: 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61 74  _WAL).  { "Creat
85a0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
85b0: 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 43  App", (SYSCALL)C
85c0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
85d0: 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23 65  FromApp, 0 },.#e
85e0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
85f0: 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
8600: 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  p", (SYSCALL)0, 
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8630: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
8640: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
8650: 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57 49  mApp ((HANDLE(WI
8660: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
8670: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
8680: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 55  ITY_ATTRIBUTES,U
8690: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43  LONG,ULONG64,LPC
86a0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  WSTR))aSyscall[7
86b0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f 2a  5].pCurrent)../*
86c0: 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e 20 73 6f 6d  .** NOTE: On som
86d0: 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73 2c  e sub-platforms,
86e0: 20 74 68 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64   the Interlocked
86f0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20  CompareExchange 
8700: 22 66 75 6e 63 74 69 6f 6e 22 0a 2a 2a 20 20 20  "function".**   
8710: 20 20 20 20 69 73 20 72 65 61 6c 6c 79 20 6a 75      is really ju
8720: 73 74 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  st a macro that 
8730: 75 73 65 73 20 61 20 63 6f 6d 70 69 6c 65 72 20  uses a compiler 
8740: 69 6e 74 72 69 6e 73 69 63 20 28 65 2e 67 2e 20  intrinsic (e.g. 
8750: 78 36 34 29 2e 0a 2a 2a 20 20 20 20 20 20 20 53  x64)..**       S
8760: 6f 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20  o do not try to 
8770: 6d 61 6b 65 20 74 68 69 73 20 69 73 20 69 6e 74  make this is int
8780: 6f 20 61 20 72 65 64 65 66 69 6e 61 62 6c 65 20  o a redefinable 
8790: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69  interface..*/.#i
87a0: 66 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72 6c  f defined(Interl
87b0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
87c0: 61 6e 67 65 29 0a 20 20 7b 20 22 49 6e 74 65 72  ange).  { "Inter
87d0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
87e0: 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c  hange", (SYSCALL
87f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8800: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
8810: 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b  fine osInterlock
8820: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
8830: 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  e InterlockedCom
8840: 70 61 72 65 45 78 63 68 61 6e 67 65 0a 23 65 6c  pareExchange.#el
8850: 73 65 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63  se.  { "Interloc
8860: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8870: 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 49 6e  ge", (SYSCALL)In
8880: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8890: 45 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c 0a 0a  Exchange, 0 },..
88a0: 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c  #define osInterl
88b0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
88c0: 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49 4e 41  ange ((LONG(WINA
88d0: 50 49 2a 29 28 4c 4f 4e 47 20 76 6f 6c 61 74 69  PI*)(LONG volati
88e0: 6c 65 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  le*, \.        L
88f0: 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63 61  ONG,LONG))aSysca
8900: 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[76].pCurrent)
8910: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
8920: 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  ed(InterlockedCo
8930: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 20 2a  mpareExchange) *
8940: 2f 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  /..}; /* End of 
8950: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
8960: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
8970: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8980: 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61  the xSetSystemCa
8990: 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73  ll() method of s
89a0: 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61  qlite3_vfs for a
89b0: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69  ll of the.** "wi
89c0: 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74  n32" VFSes.  Ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70  urn SQLITE_OK op
89e0: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  on successfully 
89f0: 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20  updating the.** 
8a00: 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e  system call poin
8a10: 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ter, or SQLITE_N
8a20: 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65  OTFOUND if there
8a30: 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61   is no configura
8a40: 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  ble.** system ca
8a50: 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a  ll named zName..
8a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
8a70: 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nSetSystemCall(.
8a80: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
8a90: 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
8aa0: 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74  /* The VFS point
8ab0: 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f  er.  Not used */
8ac0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8ad0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8ae0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74   /* Name of syst
8af0: 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72  em call to overr
8b00: 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ide */.  sqlite3
8b10: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65  _syscall_ptr pNe
8b20: 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65  wFunc  /* Pointe
8b30: 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20  r to new system 
8b40: 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  call value */.){
8b50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
8b60: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
8b70: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a  LITE_NOTFOUND;..
8b80: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8b90: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
8ba0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
8bb0: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61      /* If no zNa
8bc0: 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73  me is given, res
8bd0: 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20  tore all system 
8be0: 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64  calls to their d
8bf0: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  efault.    ** se
8c00: 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  ttings and retur
8c10: 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20  n NULL.    */.  
8c20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
8c30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8c40: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
8c50: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
8c60: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
8c70: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
8c80: 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20  i].pDefault ){. 
8c90: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
8ca0: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53  i].pCurrent = aS
8cb0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8cc0: 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  lt;.      }.    
8cd0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
8ce0: 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70  * If zName is sp
8cf0: 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65  ecified, operate
8d00: 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65   on only the one
8d10: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20   system call.   
8d20: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20   ** specified.. 
8d30: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
8d40: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8d50: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8d60: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8d70: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
8d80: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
8d90: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8da0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
8db0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8dc0: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  lt==0 ){.       
8dd0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
8de0: 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61  Default = aSysca
8df0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
8e00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8e10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
8e20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
8e30: 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77  ewFunc==0 ) pNew
8e40: 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b  Func = aSyscall[
8e50: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
8e60: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
8e70: 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77  .pCurrent = pNew
8e80: 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72  Func;.        br
8e90: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8ea0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8eb0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
8ec0: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
8ed0: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20   a system call. 
8ee0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
8ef0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a  zName is not a.*
8f00: 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73  * recognized sys
8f10: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20  tem call name.  
8f20: 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74  NULL is also ret
8f30: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73  urned if the sys
8f40: 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63  tem call.** is c
8f50: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e  urrently undefin
8f60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ed..*/.static sq
8f70: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8f80: 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61  r winGetSystemCa
8f90: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
8fa0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63  s *pNotUsed,.  c
8fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8fc0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
8fd0: 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  nt i;..  UNUSED_
8fe0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
8ff0: 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ed);.  for(i=0; 
9000: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
9010: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
9020: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
9030: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
9040: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
9050: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
9060: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  rn aSyscall[i].p
9070: 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72  Current;.  }.  r
9080: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9090: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
90a0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
90b0: 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72  ystem call after
90c0: 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d   zName.  If zNam
90d0: 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  e==NULL.** then 
90e0: 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  return the name 
90f0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
9100: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
9110: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a  n NULL if zName.
9120: 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73  ** is the last s
9130: 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66  ystem call or if
9140: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68   zName is not th
9150: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
9160: 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  d.** system call
9170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9180: 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53  t char *winNextS
9190: 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65  ystemCall(sqlite
91a0: 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20  3_vfs *p, const 
91b0: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
91c0: 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55  int i = -1;..  U
91d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
91e0: 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  p);.  if( zName 
91f0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
9200: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
9210: 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  call)-1; i++){. 
9220: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
9230: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
9240: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
9250: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
9260: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72    for(i++; i<Arr
9270: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
9280: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
9290: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
92a0: 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e  rent!=0 ) return
92b0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
92c0: 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  me;.  }.  return
92d0: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
92e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
92f0: 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  C./*.** If a Win
9300: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
9310: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
9320: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
9330: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
9340: 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74 2e  o.** compact it.
9350: 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20    Upon success, 
9360: 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20 62  SQLITE_OK will b
9370: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55 70 6f  e returned.  Upo
9380: 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a  n failure, one.*
9390: 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * of SQLITE_NOME
93a0: 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  M, SQLITE_ERROR,
93b0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
93c0: 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65 74 75  UND will be retu
93d0: 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22 70  rned.  The.** "p
93e0: 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75 6d 65  nLargest" argume
93f0: 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c  nt, if non-zero,
9400: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
9410: 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   return the size
9420: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65   of the.** large
9430: 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66 72 65  st committed fre
9440: 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20 68  e block in the h
9450: 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  eap, in bytes..*
9460: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
9470: 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61 70  n32_compact_heap
9480: 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67 65 73  (LPUINT pnLarges
9490: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
94a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54  QLITE_OK;.  UINT
94b0: 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 20   nLargest = 0;. 
94c0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
94d0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
94e0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
94f0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
9500: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
9510: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
9520: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
9530: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
9540: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
9550: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
9560: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
9570: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
9580: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
9590: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
95a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
95b0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
95c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
95d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
95e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
95f0: 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73 74  .  if( (nLargest
9600: 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28 68  =osHeapCompact(h
9610: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9620: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29 3d  32_HEAP_FLAGS))=
9630: 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  =0 ){.    DWORD 
9640: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
9650: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
9660: 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
9670: 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  =NO_ERROR ){.   
9680: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
9690: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
96a0: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70  iled to HeapComp
96b0: 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c 20  act (no space), 
96c0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
96e0: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
96f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9700: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
9710: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
9720: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22  (SQLITE_ERROR, "
9730: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
9740: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61  mpact (%lu), hea
9750: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
9760: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
9770: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
9780: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  *)hHeap);.      
9790: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
97a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
97b0: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  se.  sqlite3_log
97c0: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  (SQLITE_NOTFOUND
97d0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
97e0: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25  pCompact, heap=%
97f0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9800: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
9810: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
9820: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a  OTFOUND;.#endif.
9830: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20    if( pnLargest 
9840: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e  ) *pnLargest = n
9850: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72  Largest;.  retur
9860: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
9870: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
9880: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
9890: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
98a0: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
98b0: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74  tempt to.** dest
98c0: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
98d0: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e   it.  If the Win
98e0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69  32 native heap i
98f0: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61  s not isolated a
9900: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c  nd/or.** the sql
9910: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9920: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  () function does
9930: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f   not return zero
9940: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69  , SQLITE_BUSY wi
9950: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65  ll.** be returne
9960: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73  d and no changes
9970: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
9980: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   the Win32 nativ
9990: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73  e heap..*/.int s
99a0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73  qlite3_win32_res
99b0: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74  et_heap(){.  int
99c0: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47   rc;.  MUTEX_LOG
99d0: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
99e0: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a  x *pMaster; ) /*
99f0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
9a00: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
9a10: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
9a20: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20  _mutex *pMem; ) 
9a30: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73     /* The memsys
9a40: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
9a50: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
9a60: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
9a70: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
9a80: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9a90: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54  MASTER); ).  MUT
9aa0: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d  EX_LOGIC( pMem =
9ab0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
9ac0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9ad0: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20  STATIC_MEM); ). 
9ae0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9af0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
9b00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9b10: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69  nter(pMem);.  wi
9b20: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
9b30: 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47  );.  if( winMemG
9b40: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26  etHeap()!=NULL &
9b50: 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  & winMemGetOwned
9b60: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65  () && sqlite3_me
9b70: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
9b80: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9b90: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
9ba0: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
9bb0: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65  o outstanding me
9bc0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
9bd0: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68   on.    ** the h
9be0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63  eap.  Also, sinc
9bf0: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65  e both the maste
9c00: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63  r and memsys loc
9c10: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ks are currently
9c20: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65  .    ** being he
9c30: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68  ld by us, no oth
9c40: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  er function (i.e
9c50: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  . from another t
9c60: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20  hread) should.  
9c70: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20    ** be able to 
9c80: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20  even access the 
9c90: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74  heap.  Attempt t
9ca0: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  o destroy and re
9cb0: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a  create our.    *
9cc0: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32  * isolated Win32
9cd0: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77   native heap now
9ce0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
9cf0: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
9d00: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
9d10: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
9d20: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
9d30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9d40: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9d50: 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d  =0 );.    winMem
9d60: 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47  Shutdown(winMemG
9d70: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
9d80: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
9d90: 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20  GetHeap()==NULL 
9da0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
9db0: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
9dc0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9dd0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9de0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
9df0: 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28  rc = winMemInit(
9e00: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
9e10: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
9e20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9e30: 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  | winMemGetHeap(
9e40: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
9e50: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
9e60: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
9e70: 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20  tOwned() );.    
9e80: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9e90: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
9ea0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
9eb0: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
9ec0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
9ed0: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9ee0: 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  p cannot be modi
9ef0: 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20  fied because it 
9f00: 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20  may be in use.. 
9f10: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
9f20: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
9f30: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9f40: 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73  leave(pMem);.  s
9f50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9f60: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
9f70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
9f80: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
9f90: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
9fa0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9fb0: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70  n outputs the sp
9fc0: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73  ecified (ANSI) s
9fd0: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e  tring to the Win
9fe0: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28  32 debugger.** (
9ff0: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
a000: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  /..void sqlite3_
a010: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
a020: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  g(const char *zB
a030: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
a040: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51   char zDbgBuf[SQ
a050: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a060: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  UF_SIZE];.  int 
a070: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c  nMin = MIN(nBuf,
a080: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44   (SQLITE_WIN32_D
a090: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29  BG_BUF_SIZE - 1)
a0a0: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67  ); /* may be neg
a0b0: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20  ative. */.  if( 
a0c0: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d  nMin<-1 ) nMin =
a0d0: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61   -1; /* all nega
a0e0: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f  tive values beco
a0f0: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65  me -1. */.  asse
a100: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20  rt( nMin==-1 || 
a110: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c  nMin==0 || nMin<
a120: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a130: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66  _BUF_SIZE );.#if
a140: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a150: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
a160: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
a170: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
a180: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a190: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a1a0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
a1b0: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
a1c0: 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  n);.    osOutput
a1d0: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62  DebugStringA(zDb
a1e0: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
a1f0: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
a200: 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a  gStringA(zBuf);.
a210: 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65    }.#elif define
a220: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a230: 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65  AS_WIDE).  memse
a240: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
a250: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a260: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28  UF_SIZE);.  if (
a270: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
a280: 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20  deChar(.        
a290: 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41    osAreFileApisA
a2a0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
a2b0: 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42   CP_OEMCP, 0, zB
a2c0: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d  uf,.          nM
a2d0: 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67  in, (LPWSTR)zDbg
a2e0: 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  Buf, SQLITE_WIN3
a2f0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73  2_DBG_BUF_SIZE/s
a300: 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30  izeof(WCHAR))<=0
a310: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
a320: 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65    }.  osOutputDe
a330: 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57  bugStringW((LPCW
a340: 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65  STR)zDbgBuf);.#e
a350: 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  lse.  if( nMin>0
a360: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
a370: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
a380: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a390: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
a3a0: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
a3b0: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69   nMin);.    fpri
a3c0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
a3d0: 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  , zDbgBuf);.  }e
a3e0: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
a3f0: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
a400: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Buf);.  }.#endif
a410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
a420: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
a430: 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72  suspends the cur
a440: 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20  rent thread for 
a450: 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d  at least ms.** m
a460: 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68  illiseconds.  Th
a470: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
a480: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c   to the Win32 Sl
a490: 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e  eep() interface.
a4a0: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
a4b0: 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48  S_WINRT.static H
a4c0: 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d  ANDLE sleepObj =
a4d0: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76   NULL;.#endif..v
a4e0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
a4f0: 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69  2_sleep(DWORD mi
a500: 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  lliseconds){.#if
a510: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a520: 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a  .  if ( sleepObj
a530: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c  ==NULL ){.    sl
a540: 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74  eepObj = osCreat
a550: 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20  eEventExW(NULL, 
a560: 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45  NULL, CREATE_EVE
a570: 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c  NT_MANUAL_RESET,
a580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5a0: 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20   SYNCHRONIZE);. 
a5b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65   }.  assert( sle
a5c0: 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20  epObj!=NULL );. 
a5d0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
a5e0: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
a5f0: 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  j, milliseconds,
a600: 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20   FALSE);.#else. 
a610: 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65   osSleep(millise
a620: 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  conds);.#endif.}
a630: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a640: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
a650: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
a660: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
a670: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
a680: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
a690: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
a6a0: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
a6b0: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
a6c0: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
a6d0: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
a6e0: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
a6f0: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
a700: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
a710: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
a720: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
a730: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
a740: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
a750: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
a760: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
a770: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
a780: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
a790: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
a7a0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
a7b0: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
a7c0: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
a7d0: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
a7e0: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
a7f0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
a800: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
a810: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
a820: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
a830: 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66  PI..*/..#if !def
a840: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a850: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
a860: 7c 7c 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32  || !SQLITE_WIN32
a870: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
a880: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
a890: 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54   (1).#elif SQLIT
a8a0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
a8b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c  LITE_OS_WINRT ||
a8c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a8d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
a8e0: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
a8f0: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
a900: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
a910: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
a920: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
a930: 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66   (0).#else.# def
a940: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28  ine osIsNT()  ((
a950: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
a960: 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77  =2) || sqlite3_w
a970: 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65  in32_is_nt()).#e
a980: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
a990: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
a9a0: 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63 68  ines if the mach
a9b0: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ine is running a
a9c0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64   version of Wind
a9d0: 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ows.** based on 
a9e0: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a  the NT kernel..*
a9f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
aa00: 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b  n32_is_nt(void){
aa10: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
aa20: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
aa30: 53 49 4f 4e 45 58 29 20 26 26 20 53 51 4c 49 54  SIONEX) && SQLIT
aa40: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
aa50: 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73 49 6e 74  ONEX.  if( osInt
aa60: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
aa70: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
aa80: 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20 30 29 3d  _os_type, 0, 0)=
aa90: 3d 30 20 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  =0 ){.#if !SQLIT
aaa0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
aab0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
aac0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
aad0: 5c 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  \.        define
aae0: 64 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29  d(NTDDI_VERSION)
aaf0: 20 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f   && NTDDI_VERSIO
ab00: 4e 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 38 0a  N >= NTDDI_WIN8.
ab10: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
ab20: 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49  OW sInfo;.    sI
ab30: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
ab40: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
ab50: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47  (sInfo);.    osG
ab60: 65 74 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49  etVersionExW(&sI
ab70: 6e 66 6f 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  nfo);.#elif defi
ab80: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
ab90: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 4f  _HAS_ANSI).    O
aba0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49  SVERSIONINFOA sI
abb0: 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64  nfo;.    sInfo.d
abc0: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
abd0: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
abe0: 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72  o);.    osGetVer
abf0: 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b  sionExA(&sInfo);
ac00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 6f 73 49 6e  .#endif.    osIn
ac10: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
ac20: 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65  Exchange(&sqlite
ac30: 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20  3_os_type,.     
ac40: 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74     (sInfo.dwPlat
ac50: 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c  formId == VER_PL
ac60: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29  ATFORM_WIN32_NT)
ac70: 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 20 20   ? 2 : 1, 0);.  
ac80: 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74  }.  return osInt
ac90: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
aca0: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
acb0: 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d  _os_type, 2, 2)=
acc0: 3d 32 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  =2;.#else.  retu
acd0: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
ace0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
acf0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
ad00: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
ad10: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
ad20: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
ad30: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
ad40: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
ad50: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
ad60: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
ad70: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
ad80: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
ad90: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
ada0: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
adb0: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
adc0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
add0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
ade0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
adf0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
ae00: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
ae10: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
ae20: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
ae30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
ae40: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
ae50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
ae60: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
ae70: 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c  .  p = osHeapAll
ae80: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
ae90: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
aea0: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
aeb0: 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a  s);.  if( !p ){.
aec0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
aed0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
aee0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c  ailed to HeapAll
aef0: 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  oc %u bytes (%lu
af00: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
af20: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
af30: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
af40: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
af50: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
af60: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
af70: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
af80: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
af90: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
afa0: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
afb0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
afc0: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
afd0: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
afe0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
aff0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
b000: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
b010: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
b020: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
b030: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b040: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
b050: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
b060: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
b070: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b080: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
b090: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
b0a0: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 20    if( !pPrior ) 
b0b0: 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69  return; /* Passi
b0c0: 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46  ng NULL to HeapF
b0d0: 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ree is undefined
b0e0: 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65  . */.  if( !osHe
b0f0: 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53 51  apFree(hHeap, SQ
b100: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b110: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
b120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
b130: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
b140: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46  "failed to HeapF
b150: 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ree block %p (%l
b160: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
b180: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
b190: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
b1a0: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
b1b0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
b1c0: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
b1d0: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
b1e0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
b1f0: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
b200: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
b210: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
b220: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
b230: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
b240: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
b250: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
b260: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
b270: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
b280: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
b290: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
b2a0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
b2b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
b2c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
b2d0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
b2e0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
b2f0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
b300: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
b310: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
b320: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
b330: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
b340: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ytes>=0 );.  if(
b350: 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20   !pPrior ){.    
b360: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
b370: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b380: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b390: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
b3a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
b3b0: 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28  = osHeapReAlloc(
b3c0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b3d0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b3e0: 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29  pPrior, (SIZE_T)
b3f0: 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69  nBytes);.  }.  i
b400: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
b410: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b420: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
b430: 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28 25  o %s %u bytes (%
b440: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b460: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
b470: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
b480: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
b490: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b4b0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
b4c0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b4d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
b4e0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
b4f0: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
b500: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
b510: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
b520: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
b530: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
b540: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
b550: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
b560: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
b570: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
b580: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
b590: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b5a0: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
b5b0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
b5c0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b5d0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
b5e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
b5f0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
b600: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
b610: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
b620: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b630: 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e  FLAGS, p) );.#en
b640: 64 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72  dif.  if( !p ) r
b650: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f  eturn 0;.  n = o
b660: 73 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c  sHeapSize(hHeap,
b670: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
b680: 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20  AP_FLAGS, p);.  
b690: 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d  if( n==(SIZE_T)-
b6a0: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
b6b0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
b6c0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
b6d0: 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20  apSize block %p 
b6e0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
b6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b700: 20 70 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72   p, osGetLastErr
b710: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
b720: 61 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ap);.    return 
b730: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b740: 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (int)n;.}../*.**
b750: 20 52 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75   Round up a requ
b760: 65 73 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20  est size to the 
b770: 6e 65 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63  next valid alloc
b780: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ation size..*/.s
b790: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
b7a0: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a  Roundup(int n){.
b7b0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
b7c0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b7d0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
b7e0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
b7f0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
b800: 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44  Data){.  winMemD
b810: 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61  ata *pWinMemData
b820: 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a   = (winMemData *
b830: 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66  )pAppData;..  if
b840: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29  ( !pWinMemData )
b850: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
b860: 52 52 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20  RROR;.  assert( 
b870: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
b880: 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic1==WINMEM_MAGI
b890: 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  C1 );.  assert( 
b8a0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67  pWinMemData->mag
b8b0: 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  ic2==WINMEM_MAGI
b8c0: 43 32 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49  C2 );..#if !SQLI
b8d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
b8e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b8f0: 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21 70  _CREATE.  if( !p
b900: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
b910: 70 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64  p ){.    DWORD d
b920: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53  wInitialSize = S
b930: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b940: 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20  _INIT_SIZE;.    
b950: 44 57 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53  DWORD dwMaximumS
b960: 69 7a 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c  ize = (DWORD)sql
b970: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
b980: 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20  .nHeap;.    if( 
b990: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30  dwMaximumSize==0
b9a0: 20 29 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69   ){.      dwMaxi
b9b0: 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  mumSize = SQLITE
b9c0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
b9d0: 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  SIZE;.    }else 
b9e0: 69 66 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  if( dwInitialSiz
b9f0: 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20  e>dwMaximumSize 
ba00: 29 7b 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69  ){.      dwIniti
ba10: 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d  alSize = dwMaxim
ba20: 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  umSize;.    }.  
ba30: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
ba40: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
ba50: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
ba60: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
baa0: 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29  , dwMaximumSize)
bab0: 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d  ;.    if( !pWinM
bac0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
bad0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
bae0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
baf0: 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69 6c  .          "fail
bb00: 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ed to HeapCreate
bb10: 20 28 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75   (%lu), flags=%u
bb20: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20  , initSize=%lu, 
bb30: 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20  maxSize=%lu",.  
bb40: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
bb50: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
bb60: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
bb70: 53 2c 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  S, dwInitialSize
bb80: 2c 0a 20 20 20 20 20 20 20 20 20 20 64 77 4d 61  ,.          dwMa
bb90: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
bba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bbb0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
bbc0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
bbd0: 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  wned = TRUE;.   
bbe0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
bbf0: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
bc00: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e    }.#else.  pWin
bc10: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
bc20: 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61   osGetProcessHea
bc30: 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e  p();.  if( !pWin
bc40: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
bc50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
bc60: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a  g(SQLITE_NOMEM,.
bc70: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
bc80: 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61  to GetProcessHea
bc90: 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c  p (%lu)", osGetL
bca0: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
bcb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
bcc0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
bcd0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
bce0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
bcf0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
bd00: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
bd10: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
bd20: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
bd30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bd40: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
bd50: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
bd60: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
bd70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
bd80: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
bd90: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
bda0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
bdb0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
bdc0: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
bdd0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
bde0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
bdf0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
be00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
be10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
be20: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
be30: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
be40: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
be50: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
be60: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
be70: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
be80: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
be90: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
bea0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
beb0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
bec0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
bed0: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
bee0: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
bef0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
bf00: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
bf10: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
bf20: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bf30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bf40: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bf50: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
bf60: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
bf70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
bf80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
bf90: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
bfa0: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
bfb0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
bfc0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
bfd0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
bfe0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
bff0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
c000: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
c010: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
c020: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
c030: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
c040: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
c050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c060: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
c070: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
c080: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
c090: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
c0b0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
c0c0: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
c0d0: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
c0e0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
c0f0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
c100: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
c110: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
c120: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
c130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
c140: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
c150: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c160: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
c170: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
c180: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
c190: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
c1a0: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
c1b0: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
c1c0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
c1d0: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
c1e0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
c1f0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
c200: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
c210: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
c220: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
c230: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
c240: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
c250: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
c260: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
c270: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
c280: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
c290: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
c2a0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c2b0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
c2c0: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
c2d0: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
c2e0: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
c2f0: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
c300: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
c310: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
c320: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
c330: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
c340: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
c350: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
c360: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
c370: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
c380: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
c390: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
c3a0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
c3b0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
c3c0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
c3d0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
c3e0: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
c3f0: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
c400: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
c410: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
c420: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
c430: 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46  oft Unicode (UTF
c440: 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  -16?)..**.** Spa
c450: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
c460: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c470: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
c480: 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69  malloc..*/.stati
c490: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
c4a0: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
c4b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
c4c0: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
c4d0: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
c4e0: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
c4f0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
c500: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
c510: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
c520: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
c530: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
c540: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c550: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
c560: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
c570: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
c580: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
c590: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
c5a0: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
c5b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c5c0: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
c5d0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
c5e0: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
c5f0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
c600: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
c630: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
c640: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
c650: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
c660: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
c670: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
c680: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
c690: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
c6a0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
c6b0: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
c6c0: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
c6d0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
c6e0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
c6f0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
c700: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
c710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c720: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
c730: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
c740: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
c750: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
c760: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42  zFilename;..  nB
c770: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
c780: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
c790: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  TF8, 0, zWideFil
c7a0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c  ename, -1, 0, 0,
c7b0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
c7c0: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
c7d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c7e0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  zFilename = sqli
c7f0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
c800: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
c810: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
c820: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c830: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
c840: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
c850: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
c860: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  eFilename, -1, z
c870: 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c  Filename, nByte,
c880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
c8b0: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
c8c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
c8d0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69  lename);.    zFi
c8e0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
c8f0: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
c900: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
c910: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
c920: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
c930: 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64 20   Unicode, based 
c940: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
c950: 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74 69  t codepage setti
c960: 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70 69  ngs for file api
c970: 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
c980: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
c990: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
c9a0: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
c9b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a  qlite3_malloc..*
c9c0: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
c9d0: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
c9e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
c9f0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
ca00: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
ca10: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  MbcsFilename;.  
ca20: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
ca30: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
ca40: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
ca50: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
ca60: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
ca70: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
ca80: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
ca90: 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20   -1, NULL,.     
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69             0)*si
cac0: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69  zeof(WCHAR);.  i
cad0: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
cae0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
caf0: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
cb00: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
cb10: 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
cb20: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
cb30: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
cb40: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
cb50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cb60: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
cb70: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
cb80: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
cb90: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
cba0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20  zMbcsFilename,. 
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
cbd0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
cbe0: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  te==0 ){.    sql
cbf0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46  ite3_free(zMbcsF
cc00: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
cc10: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
cc20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
cc30: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
cc40: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
cc50: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
cc60: 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68  to multi-byte ch
cc70: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20  aracter string, 
cc80: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
cc90: 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65  user's ANSI code
cca0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
ccb0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
ccc0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
ccd0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
cce0: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
ccf0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
cd00: 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f  ar *winUnicodeTo
cd10: 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69  Mbcs(LPCWSTR zWi
cd20: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
cd30: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
cd40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69   *zFilename;.  i
cd50: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
cd60: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
cd70: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
cd80: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
cd90: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
cda0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
cdb0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
cdc0: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
cdd0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
cde0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
cdf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
ce00: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
ce10: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
ce20: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
ce30: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
ce40: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
ce50: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
ce60: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
ce70: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
ce80: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
ce90: 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
cec0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
ced0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
cee0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65  lite3_free(zFile
cef0: 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  name);.    zFile
cf00: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
cf10: 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65  return zFilename
cf20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
cf30: 72 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  rt multibyte cha
cf40: 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f  racter string to
cf50: 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74   UTF-8.  Space t
cf60: 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65  o hold the.** re
cf70: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
cf80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
cf90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
cfa0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
cfb0: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
cfc0: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
cfd0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
cfe0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74  har *zFilenameUt
cff0: 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  f8;.  LPWSTR zTm
d000: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
d010: 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e  de = winMbcsToUn
d020: 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
d030: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
d040: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d050: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
d060: 6e 61 6d 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  nameUtf8 = winUn
d070: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
d080: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
d090: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
d0a0: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
d0b0: 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameUtf8;.}../*.*
d0c0: 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20  * Convert UTF-8 
d0d0: 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61  to multibyte cha
d0e0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20  racter string.  
d0f0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d100: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
d110: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
d120: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
d130: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
d140: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
d150: 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73  tf8_to_mbcs(cons
d160: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
d170: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
d180: 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57  enameMbcs;.  LPW
d190: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
d1a0: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 55   zTmpWide = winU
d1b0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
d1c0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
d1d0: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
d1e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d1f0: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
d200: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62  = winUnicodeToMb
d210: 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  cs(zTmpWide);.  
d220: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
d230: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
d240: 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a   zFilenameMbcs;.
d250: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
d260: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
d270: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
d280: 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
d290: 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64 20  directory based 
d2a0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64  on.** the provid
d2b0: 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54  ed arguments.  T
d2c0: 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74  he type argument
d2d0: 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72   must be 1 in or
d2e0: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a  der to set the.*
d2f0: 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  * data directory
d300: 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74   or 2 in order t
d310: 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72  o set the tempor
d320: 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20  ary directory.  
d330: 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72  The zValue.** ar
d340: 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
d350: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63 74  me of the direct
d360: 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65  ory to use.  The
d370: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69   return value wi
d380: 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  ll be.** SQLITE_
d390: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
d3a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d3b0: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
d3c0: 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c  tory(DWORD type,
d3d0: 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29   LPCWSTR zValue)
d3e0: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72  {.  char **ppDir
d3f0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e  ectory = 0;.#ifn
d400: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d410: 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72  AUTOINIT.  int r
d420: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
d430: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
d440: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d450: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70  #endif.  if( typ
d460: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d470: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
d480: 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72  YPE ){.    ppDir
d490: 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65  ectory = &sqlite
d4a0: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
d4b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79  ;.  }else if( ty
d4c0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
d4d0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
d4e0: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
d4f0: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
d500: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
d510: 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
d520: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
d530: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d540: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
d550: 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20  RY_TYPE.        
d560: 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54    || type==SQLIT
d570: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
d580: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b  ECTORY_TYPE.  );
d590: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
d5a0: 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74  rectory || sqlit
d5b0: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
d5c0: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20  e(*ppDirectory, 
d5d0: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
d5e0: 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74 6f  .  if( ppDirecto
d5f0: 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ry ){.    char *
d600: 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a  zValueUtf8 = 0;.
d610: 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26      if( zValue &
d620: 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20  & zValue[0] ){. 
d630: 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20       zValueUtf8 
d640: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
d650: 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  f8(zValue);.    
d660: 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66    if ( zValueUtf
d670: 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  8==0 ){.        
d680: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d690: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
d6a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
d6b0: 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ree(*ppDirectory
d6c0: 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74  );.    *ppDirect
d6d0: 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38  ory = zValueUtf8
d6e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d6f0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
d700: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
d710: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  R;.}../*.** The 
d720: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
d730: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
d740: 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  sg.** is zero if
d750: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
d760: 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
d770: 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
d780: 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
d790: 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
d7a0: 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a  was truncated)..
d7b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
d7c0: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
d7d0: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
d7e0: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
d7f0: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
d800: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
d810: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
d820: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
d830: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
d840: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
d850: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
d860: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
d870: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
d880: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
d890: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
d8a0: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
d8b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
d8c0: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e   0;..  if( osIsN
d8d0: 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
d8e0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57  E_OS_WINRT.    W
d8f0: 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53  CHAR zTempWide[S
d900: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
d910: 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b  ERRMSG_CHARS+1];
d920: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
d930: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f  ormatMessageW(FO
d940: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
d950: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
d980: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
d990: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
d9e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
da00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
da20: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
da50: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
da60: 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20  HARS,.          
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20     0);.#else.   
da90: 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64   LPWSTR zTempWid
daa0: 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  e = NULL;.    dw
dab0: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
dac0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
dad0: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
dae0: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
db10: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
db20: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
db40: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
db50: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
db80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
db90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
dba0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbe0: 20 20 20 20 20 20 28 4c 50 57 53 54 52 29 20 26        (LPWSTR) &
dbf0: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc10: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64          0);.#end
dc40: 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  if.    if( dwLen
dc50: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
dc60: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
dc70: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
dc80: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
dc90: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
dca0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
dcb0: 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63    zOut = winUnic
dcc0: 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57  odeToUtf8(zTempW
dcd0: 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ide);.      sqli
dce0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
dcf0: 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  oc();.#if !SQLIT
dd00: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
dd10: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
dd20: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
dd30: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
dd40: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
dd50: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
dd60: 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Wide);.#endif.  
dd70: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
dd80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
dd90: 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
dda0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e   char *zTemp = N
ddb0: 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  ULL;.    dwLen =
ddc0: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
ddd0: 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  A(FORMAT_MESSAGE
dde0: 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52  _ALLOCATE_BUFFER
ddf0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
de20: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de40: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
de50: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
de60: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
deb0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ded0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
def0: 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c   (LPSTR) &zTemp,
df00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
df20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
df40: 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  ;.    if( dwLen 
df50: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
df60: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
df70: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
df80: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
df90: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
dfa0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
dfb0: 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
dfc0: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
dfd0: 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  f8(zTemp);.     
dfe0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
dff0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
e000: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79 73   /* free the sys
e010: 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  tem buffer alloc
e020: 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65  ated by FormatMe
e030: 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f  ssage */.      o
e040: 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70  sLocalFree(zTemp
e050: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
e060: 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64  dif.  if( 0 == d
e070: 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  wLen ){.    sqli
e080: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e090: 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f  f, zBuf, "OsErro
e0a0: 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20  r 0x%lx (%lu)", 
e0b0: 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45  lastErrno, lastE
e0c0: 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rrno);.  }else{.
e0d0: 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61      /* copy a ma
e0e0: 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68  ximum of nBuf ch
e0f0: 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75  ars to output bu
e100: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
e110: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
e120: 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  f, zBuf, "%s", z
e130: 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65  Out);.    /* fre
e140: 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66 65  e the UTF8 buffe
e150: 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
e160: 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d  _free(zOut);.  }
e170: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e180: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
e190: 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45  nction - winLogE
e1a0: 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69  rrorAtLine() - i
e1b0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
e1c0: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
e1d0: 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  .** winLogError(
e1e0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
e1f0: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
e200: 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   after an error 
e210: 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20  occurs in an OS 
e220: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
e230: 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75  logs a message u
e240: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67  sing sqlite3_log
e250: 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  () containing th
e260: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
e270: 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  of.** error code
e280: 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c   and, if possibl
e290: 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61  e, the human-rea
e2a0: 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74  dable equivalent
e2b0: 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d   from.** FormatM
e2c0: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  essage..**.** Th
e2d0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
e2e0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
e2f0: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
e300: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
e310: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
e320: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
e330: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
e340: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
e350: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a  TE_CANTOPEN)..**
e360: 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71 75   The two subsequ
e370: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68  ent arguments sh
e380: 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65  ould be the name
e390: 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74   of the OS funct
e3a0: 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c  ion that.** fail
e3b0: 65 64 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ed and the assoc
e3c0: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
e3d0: 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a  m path, if any..
e3e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f  */.#define winLo
e3f0: 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20  gError(a,b,c,d) 
e400: 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c    winLogErrorAtL
e410: 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49  ine(a,b,c,d,__LI
e420: 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  NE__).static int
e430: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
e440: 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64  ne(.  int errcod
e450: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e460: 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20        /* SQLite 
e470: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
e480: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c  DWORD lastErrno,
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72  /* Win32 last er
e4b0: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
e4c0: 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20  har *zFunc,     
e4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
e4e0: 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   of OS function 
e4f0: 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20  that failed */. 
e500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
e510: 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  th,             
e520: 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73   /* File path as
e530: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 72  sociated with er
e540: 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ror */.  int iLi
e550: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
e560: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72           /* Sour
e570: 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77  ce line number w
e580: 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72  here error occur
e590: 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  red */.){.  char
e5a0: 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20   zMsg[500];     
e5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
e5c0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72  uman readable er
e5d0: 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  ror text */.  in
e5e0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e600: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
e610: 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b  ..  zMsg[0] = 0;
e620: 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
e630: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
e640: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
e650: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
e660: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
e670: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
e680: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
e690: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
e6a0: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
e6b0: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
e6c0: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
e6d0: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
e6e0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
e6f0: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
e700: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
e710: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
e720: 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
e730: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
e740: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
e750: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
e760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
e770: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
e780: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
e790: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
e7a0: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
e7b0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
e7c0: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
e7d0: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
e7e0: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
e7f0: 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f  .** antivirus so
e800: 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68  ftware.  Also th
e810: 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20  e initial delay 
e820: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
e830: 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64   retry..** The d
e840: 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c  elay increases l
e850: 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61 63  inearly with eac
e860: 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e  h retry..*/.#ifn
e870: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
e880: 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64  _IOERR_RETRY.# d
e890: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
e8a0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31  32_IOERR_RETRY 1
e8b0: 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  0.#endif.#ifndef
e8c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e8d0: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a  ERR_RETRY_DELAY.
e8e0: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
e8f0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
e900: 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69  Y_DELAY 25.#endi
e910: 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  f.static int win
e920: 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c  IoerrRetry = SQL
e930: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
e940: 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e  RETRY;.static in
e950: 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  t winIoerrRetryD
e960: 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  elay = SQLITE_WI
e970: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
e980: 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  DELAY;../*.** Th
e990: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
e9a0: 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75  try1" macro is u
e9b0: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
e9c0: 20 69 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   if a particular
e9d0: 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   I/O.** error co
e9e0: 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  de obtained via 
e9f0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69  GetLastError() i
ea00: 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65  s eligible to be
ea10: 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a   retried.  It.**
ea20: 20 6d 75 73 74 20 61 63 63 65 70 74 20 74 68 65   must accept the
ea30: 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52   error code DWOR
ea40: 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72  D as its only ar
ea50: 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c  gument and shoul
ea60: 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
ea70: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
ea80: 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69  r code is transi
ea90: 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e  ent in nature an
eaa0: 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a  d the operation.
eab0: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
eac0: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  or generating th
ead0: 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72  e original error
eae0: 20 6d 69 67 68 74 20 73 75 63 63 65 65 64 20 75   might succeed u
eaf0: 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74  pon being.** ret
eb00: 72 69 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d  ried.  The argum
eb10: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
eb20: 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61  o should be a va
eb30: 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64  riable..**.** Ad
eb40: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61  ditionally, a ma
eb50: 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f  cro named "winIo
eb60: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
eb70: 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49  y be defined.  I
eb80: 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e  f it.** is defin
eb90: 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63  ed, it will be c
eba0: 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68  onsulted only wh
ebb0: 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69  en the macro "wi
ebc0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
ebd0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  .** returns zero
ebe0: 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  .  The "winIoerr
ebf0: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
ec00: 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f   is completely o
ec10: 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d  ptional and.** m
ec20: 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e  ay be used to in
ec30: 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c  clude additional
ec40: 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20   error codes in 
ec50: 74 68 65 20 73 65 74 20 74 68 61 74 20 73 68 6f  the set that sho
ec60: 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  uld.** result in
ec70: 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f   the failing I/O
ec80: 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67   operation being
ec90: 20 72 65 74 72 69 65 64 20 62 79 20 74 68 65 20   retried by the 
eca0: 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64  caller.  If.** d
ecb0: 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e  efined, the "win
ecc0: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
ecd0: 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62  macro must exhib
ece0: 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61  it external sema
ecf0: 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63  ntics.** identic
ed00: 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74  al to those of t
ed10: 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  he "winIoerrCanR
ed20: 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f  etry1" macro..*/
ed30: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 77 69  .#if !defined(wi
ed40: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29  nIoerrCanRetry1)
ed50: 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72  .#define winIoer
ed60: 72 43 61 6e 52 65 74 72 79 31 28 61 29 20 28 28  rCanRetry1(a) ((
ed70: 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53  (a)==ERROR_ACCES
ed80: 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20 20 20  S_DENIED)       
ed90: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
edc0: 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f  SHARING_VIOLATIO
edd0: 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20  N)    || \.     
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
ee00: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
ee10: 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ION)       || \.
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
ee40: 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f  a)==ERROR_DEV_NO
ee50: 54 5f 45 58 49 53 54 29 20 20 20 20 20 20 20 20  T_EXIST)        
ee60: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
ee90: 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20  ETNAME_DELETED) 
eea0: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
eed0: 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29  ROR_SEM_TIMEOUT)
eee0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20            || \. 
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
ef10: 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b  )==ERROR_NETWORK
ef20: 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23  _UNREACHABLE)).#
ef30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
ef40: 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20  a ReadFile() or 
ef50: 57 72 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f  WriteFile() erro
ef60: 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65  r occurs, invoke
ef70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
ef80: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 73 68   to see if it sh
ef90: 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e  ould be retried.
efa0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f    Return TRUE to
efb0: 20 72 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20   retry.  Return 
efc0: 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65  FALSE.** to give
efd0: 20 75 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f   up with an erro
efe0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
eff0: 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69   winRetryIoerr(i
f000: 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f  nt *pnRetry, DWO
f010: 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44  RD *pError){.  D
f020: 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
f030: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28  stError();.  if(
f040: 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f   *pnRetry>=winIo
f050: 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20  errRetry ){.    
f060: 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
f070: 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b      *pError = e;
f080: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
f090: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77  n 0;.  }.  if( w
f0a0: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
f0b0: 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
f0c0: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
f0d0: 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
f0e0: 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
f0f0: 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
f100: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f110: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77   }.#if defined(w
f120: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
f130: 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e  ).  else if( win
f140: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 28 65  IoerrCanRetry2(e
f150: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
f160: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
f170: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f180: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
f190: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
f1a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f1b0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45  .#endif.  if( pE
f1c0: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
f1d0: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
f1e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f1f0: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
f200: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
f210: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f220: 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20  winLogIoerr(int 
f230: 6e 52 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e  nRetry){.  if( n
f240: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  Retry ){.    sql
f250: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
f260: 49 4f 45 52 52 2c 0a 20 20 20 20 20 20 22 64 65  IOERR,.      "de
f270: 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c  layed %dms for l
f280: 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66  ock/sharing conf
f290: 6c 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e  lict",.      win
f2a0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
f2b0: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
f2c0: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
f2d0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
f2e0: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
f2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f330: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
f340: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
f350: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
f360: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
f370: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
f380: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
f390: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
f3a0: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
f3b0: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
f3c0: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
f3d0: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
f3e0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
f3f0: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
f400: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
f410: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
f420: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
f430: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
f440: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
f450: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
f460: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
f470: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
f480: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
f490: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
f4a0: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
f4b0: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
f4c0: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
f4d0: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
f4e0: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
f4f0: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
f500: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
f510: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
f520: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
f530: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
f540: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
f550: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
f560: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
f570: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
f580: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
f590: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
f5a0: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
f5b0: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
f5c0: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
f5d0: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
f5e0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
f5f0: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
f600: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
f610: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
f620: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
f630: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
f640: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
f650: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
f660: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
f670: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
f680: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
f690: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
f6a0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
f6b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
f6c0: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
f6d0: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
f6e0: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
f6f0: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
f700: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
f710: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
f720: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
f730: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
f740: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
f750: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
f760: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
f770: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
f780: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
f790: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
f7a0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
f7b0: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
f7c0: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
f7d0: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
f7e0: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
f7f0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
f800: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
f810: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
f820: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
f830: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
f840: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
f850: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
f860: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
f870: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
f880: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
f890: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
f8a0: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
f8b0: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
f8c0: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
f8d0: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
f8e0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e  ;..  zName = win
f8f0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
f900: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
f910: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
f920: 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  /* out of memory
f930: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f940: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
f950: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  M;.  }..  /* Ini
f960: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
f970: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
f980: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
f990: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
f9a0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
f9b0: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
f9c0: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
f9d0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
f9e0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
f9f0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
fa00: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
fa10: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
fa20: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
fa30: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
fa40: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
fa50: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
fa60: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
fa70: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
fa80: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
fa90: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
faa0: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
fab0: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
fac0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
fad0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
fae0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
faf0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
fb00: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
fb10: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
fb20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
fb30: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
fb40: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
fb50: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb70: 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
fb80: 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
fb90: 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
fba0: 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
fbb0: 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
fbc0: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
fbd0: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
fbe0: 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
fbf0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
fc00: 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
fc10: 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
fc20: 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
fc30: 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
fc40: 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
fc50: 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
fc60: 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
fc70: 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
fc80: 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
fc90: 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
fca0: 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
fcb0: 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
fcc0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
fcd0: 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
fce0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
fcf0: 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
fd00: 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd30: 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
fd40: 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
fd50: 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
fd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
fd90: 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
fda0: 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
fdb0: 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
fdc0: 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
fdd0: 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
fde0: 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
fdf0: 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
fe00: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
fe10: 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
fe20: 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
fe30: 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
fe40: 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
fe50: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
fe60: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
fe70: 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
fe80: 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
fe90: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
fea0: 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
feb0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
fec0: 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
fed0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
fee0: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
fef0: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
ff00: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
ff10: 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
ff20: 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
ff30: 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
ff40: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
ff50: 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
ff60: 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
ff70: 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
ff80: 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
ff90: 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
ffa0: 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
ffb0: 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
ffc0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
ffd0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
ffe0: 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
fff0: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
10000 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10020 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
10030 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
10040 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
10050 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
10060 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
10070 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
10080 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
10090 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
100a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
100b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
100c0 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
100d0 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
100e0 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
100f0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
10100 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
10110 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
10120 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
10130 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
10140 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
10150 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10160 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
10170 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
10190 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
101a0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
101b0 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
101c0 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
101d0 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
101e0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
101f0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
10200 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
10210 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
10220 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
10230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10240 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
10250 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
10260 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
10270 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
10280 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
10290 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
102a0 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
102b0 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
102c0 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
102d0 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
102e0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
102f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
10310 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
10320 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
10330 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
10340 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
10350 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
10360 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
10370 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
10380 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
10390 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
103a0 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
103b0 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
103c0 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
103d0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
103e0 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
103f0 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
10400 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
10410 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
10420 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
10430 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
10440 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
10450 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
10460 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
10470 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10480 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
10490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
104a0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
104b0 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
104c0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
104d0 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
104e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
104f0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
10500 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
10510 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
10520 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
10530 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
10540 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
10550 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
10560 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10570 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
10580 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
10590 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
105a0 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
105b0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
105c0 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
105d0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
105e0 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
105f0 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
10600 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
10610 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
10620 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
10630 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
10640 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
10650 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
10660 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
10670 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
10680 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
10690 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
106a0 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
106b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
106c0 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
106d0 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
106e0 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
106f0 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
10700 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
10710 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
10720 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
10730 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
10740 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
10750 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
10760 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
10770 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
10780 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
10790 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
107a0 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
107b0 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
107c0 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
107d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
107e0 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
107f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10800 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
10810 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
10820 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
10830 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
10840 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
10850 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
10860 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
10870 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
10880 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
10890 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
108a0 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
108b0 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
108c0 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
108d0 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
108e0 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
108f0 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
10900 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
10910 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
10920 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
10930 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
10940 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10950 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
10960 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
10970 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
10980 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
10990 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
109a0 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
109b0 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
109c0 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
109d0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
109e0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
109f0 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
10a00 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
10a10 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
10a20 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
10a30 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
10a40 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
10a50 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
10a60 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10a70 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
10a80 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
10a90 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
10aa0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10ab0 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
10ac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10ad0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
10ae0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
10af0 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
10b00 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
10b10 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
10b20 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
10b30 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
10b40 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
10b50 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
10b60 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
10b70 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
10b80 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
10b90 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
10ba0 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
10bb0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
10bc0 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
10bd0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10be0 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
10bf0 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
10c00 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
10c10 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
10c20 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
10c30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
10c40 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
10c50 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
10c60 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
10c70 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
10c80 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
10c90 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
10ca0 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
10cb0 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
10cc0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
10cd0 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
10ce0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
10cf0 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
10d00 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
10d10 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
10d20 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
10d30 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
10d50 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
10d60 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
10d70 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
10d80 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
10d90 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
10da0 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
10db0 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
10dc0 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
10dd0 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
10de0 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
10df0 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
10e00 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
10e10 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
10e20 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
10e30 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
10e40 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
10e50 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
10e60 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
10e70 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
10e80 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
10e90 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
10ea0 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
10eb0 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
10ec0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
10ed0 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
10ee0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
10ef0 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
10f00 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
10f10 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
10f20 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
10f30 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
10f40 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
10f50 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
10f60 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
10f70 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
10f80 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
10f90 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
10fa0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
10fb0 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
10fc0 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
10fd0 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
10fe0 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
10ff0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
11000 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
11010 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
11020 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
11030 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11040 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
11050 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
11060 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
11070 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11080 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11090 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
110a0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
110b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
110c0 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
110d0 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
110e0 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
110f0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11100 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
11110 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
11120 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
11130 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
11140 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
11150 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
11160 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
11170 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11180 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
11190 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
111a0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
111b0 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
111c0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
111d0 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
111e0 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
111f0 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11200 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11210 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
11220 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
11230 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11240 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11250 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
11260 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11270 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11280 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
11290 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
112a0 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
112b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
112c0 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
112d0 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
112e0 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
112f0 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
11300 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
11320 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
11330 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
11340 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
11350 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
11360 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
11370 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
11380 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
11390 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
113a0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
113b0 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
113c0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
113d0 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
113e0 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
113f0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
11400 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
11410 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
11420 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
11430 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
11440 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11450 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
11460 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
11470 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
11480 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
11490 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
114a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
114e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
114f0 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
11500 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
11510 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
11520 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
11530 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11540 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
11550 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
11560 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
11570 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
11580 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
11590 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
115a0 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
115b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
115c0 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
115d0 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
115e0 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
115f0 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
11600 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
11610 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
11620 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
11630 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
11640 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
11650 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
11660 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
11670 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
11680 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
11690 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
116a0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
116b0 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
116c0 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
116d0 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
116e0 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
116f0 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
11700 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
11710 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
11720 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
11730 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
11740 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
11750 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
11760 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
11770 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
11780 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
11790 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
117a0 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
117b0 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
117c0 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
117d0 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
117e0 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
117f0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
11800 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
11810 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
11820 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
11830 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11840 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
11850 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
11860 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
11870 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
11880 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
11890 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
118a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
118b0 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
118c0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
118d0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
118e0 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
118f0 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
11900 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
11910 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
11920 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
11930 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
11940 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
11950 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
11980 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
11990 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
119a0 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
119b0 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
119c0 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
119d0 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
119e0 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
119f0 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
11a00 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
11a10 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
11a20 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
11a30 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
11a40 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
11a50 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
11a60 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
11a70 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
11a80 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
11a90 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
11aa0 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
11ab0 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
11ae0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
11af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11b40 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
11b50 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
11b60 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
11b70 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
11b80 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
11b90 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
11ba0 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
11bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11bf0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
11c00 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
11c10 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
11c20 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
11c30 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
11c40 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
11c50 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
11c60 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
11c70 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
11c80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
11c90 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
11ca0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
11cb0 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
11cc0 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
11cd0 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
11ce0 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
11cf0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
11d00 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
11d10 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
11d20 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
11d30 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
11d40 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
11d50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
11d60 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
11d70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
11d80 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
11d90 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
11da0 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
11db0 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
11dc0 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
11dd0 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
11de0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
11df0 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
11e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e10 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
11e20 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
11e30 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
11e40 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
11e50 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
11e60 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
11e70 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
11e80 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
11e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11ea0 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
11eb0 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
11ec0 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
11ed0 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
11ee0 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
11ef0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
11f00 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
11f10 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
11f20 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
11f30 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
11f40 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
11f50 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
11f60 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
11f70 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
11f80 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
11f90 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
11fa0 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
11fb0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
11fc0 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
11fd0 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
11fe0 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
11ff0 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
12000 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
12010 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
12020 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
12030 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
12040 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
12050 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
12060 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
12070 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
12080 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
12090 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
120a0 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
120b0 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
120c0 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
120d0 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
120e0 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
120f0 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
12100 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
12110 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
12120 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
12130 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
12140 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
12150 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
12160 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
12170 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12180 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
12190 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
121a0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
121b0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
121c0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
121d0 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
121e0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
121f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
12200 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
12210 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
12220 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
12230 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
12240 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
12250 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
12260 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
12270 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12280 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12290 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
122a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
122b0 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
122c0 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
122d0 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
122e0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
122f0 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
12300 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
12310 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
12320 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
12330 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
12340 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12360 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
12370 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
12380 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
12390 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
123a0 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
123b0 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
123c0 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
123d0 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
123e0 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
123f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12400 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12410 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
12420 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12430 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
12440 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12450 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
12460 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
12470 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
12480 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12490 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
124a0 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
124b0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
124c0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
124d0 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
124e0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
124f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12500 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
12510 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
12520 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12530 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
12540 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
12550 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
12560 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
12570 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
12580 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
12590 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
125a0 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
125b0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
125c0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
125d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
125e0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
125f0 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
12600 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
12610 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
12620 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
12630 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
12640 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
12650 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
12660 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
12670 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
12680 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
12690 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
126a0 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
126b0 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
126c0 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
126d0 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
126e0 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
126f0 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
12700 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
12710 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
12720 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
12730 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
12740 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
12750 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
12760 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
12770 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
12780 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
12790 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
127a0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
127b0 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
127c0 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
127d0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
127e0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
127f0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12800 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12810 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
12820 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
12830 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
12840 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
12850 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
12860 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
12870 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
12880 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
12890 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
128a0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
128b0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
128c0 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
128d0 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  File);.#endif.. 
128e0 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73   do{.    rc = os
128f0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
12900 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69  e->h);.    /* Si
12910 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12920 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53  c=0; cnt=MX_CLOS
12930 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f  E_ATTEMPT; ); */
12940 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30  .  }while( rc==0
12950 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43   && ++cnt < MX_C
12960 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20  LOSE_ATTEMPT && 
12970 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73  (sqlite3_win32_s
12980 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
12990 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
129a0 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e  INCE.#define WIN
129b0 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
129c0 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65  MPTS 3.  winceDe
129d0 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29  stroyLock(pFile)
129e0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a  ;.  if( pFile->z
129f0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b  DeleteOnClose ){
12a00 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
12a10 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20  ;.    while(.   
12a20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65          osDelete
12a30 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65  FileW(pFile->zDe
12a40 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a  leteOnClose)==0.
12a50 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74          && osGet
12a60 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
12a70 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
12a80 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66  Close)!=0xffffff
12a90 66 66 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  ff.        && cn
12aa0 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
12ab0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
12ac0 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
12ad0 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
12ae0 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
12af0 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
12b00 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
12b10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12b20 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
12b30 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
12b40 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
12b50 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
12b60 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  h = NULL;.  }.  
12b70 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
12b80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
12b90 53 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25  SE file=%p, rc=%
12ba0 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  s\n", pFile->h, 
12bb0 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
12bc0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
12bd0 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a   rc ? SQLITE_OK.
12be0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69              : wi
12bf0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
12c00 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73  _IOERR_CLOSE, os
12c10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c            "winCl
12c40 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
12c50 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
12c60 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
12c70 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
12c80 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
12c90 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
12ca0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
12cb0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
12cc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
12cd0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
12ce0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
12cf0 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
12d00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
12d10 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
12d20 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
12d30 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
12d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12d50 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
12d60 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
12d70 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12da0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
12db0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
12dc0 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
12dd0 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
12de0 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
12df0 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
12e00 4f 53 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c  OS_WINCE.  OVERL
12e10 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64  APPED overlapped
12e20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
12e30 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61  e offset for Rea
12e40 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66  dFile. */.#endif
12e50 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
12e60 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
12e70 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c  ;  /* file handl
12e80 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65  e */.  DWORD nRe
12e90 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
12ea0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12eb0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
12ec0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c  ly read from fil
12ed0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
12ee0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
12ef0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12f00 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20   of retrys */.. 
12f10 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
12f20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
12f30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
12f40 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69  ffset>=0 );.  Si
12f50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
12f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12f70 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41  R_READ);.  OSTRA
12f80 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
12f90 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
12fa0 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d  ount=%d, offset=
12fb0 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
12fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
12fd0 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
12fe0 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
12ff0 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
13000 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
13010 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
13020 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
13030 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71  of this read req
13040 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
13050 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
13060 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
13070 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
13080 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
13090 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
130a0 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
130b0 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
130c0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
130d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
130e0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
130f0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
13100 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
13110 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20  ffset], amt);.  
13120 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
13130 41 44 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c  AD-MMAP file=%p,
13140 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
13150 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13160 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13170 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
13180 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  .      int nCopy
13190 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e   = (int)(pFile->
131a0 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
131b0 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
131c0 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
131d0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
131e0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f  n))[offset], nCo
131f0 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
13200 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
13210 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
13220 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
13230 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
13240 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
13250 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
13260 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 77  OS_WINCE.  if( w
13270 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65  inSeekFile(pFile
13280 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  , offset) ){.   
13290 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
132a0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
132b0 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c  TE_FULL\n", pFil
132c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
132d0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
132e0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73    }.  while( !os
132f0 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
13300 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
13310 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73  Read, 0) ){.#els
13320 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72  e.  memset(&over
13330 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f  lapped, 0, sizeo
13340 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
13350 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
13360 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
13370 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
13380 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
13390 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
133a0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
133b0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
133c0 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64    while( !osRead
133d0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
133e0 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64  Buf, amt, &nRead
133f0 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26  , &overlapped) &
13400 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  &.         osGet
13410 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52  LastError()!=ERR
13420 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b  OR_HANDLE_EOF ){
13430 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52  .#endif.    DWOR
13440 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  D lastErrno;.   
13450 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65   if( winRetryIoe
13460 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
13470 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
13480 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ue;.    pFile->l
13490 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
134a0 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
134b0 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70  E(("READ file=%p
134c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
134d0 52 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c 65  R_READ\n", pFile
134e0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
134f0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
13500 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c  LITE_IOERR_READ,
13510 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13520 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13530 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65            "winRe
13540 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ad", pFile->zPat
13550 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67  h);.  }.  winLog
13560 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
13570 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
13580 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
13590 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
135a0 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
135b0 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
135c0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
135d0 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
135e0 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
135f0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
13600 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72  "READ file=%p, r
13610 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  c=SQLITE_IOERR_S
13620 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46  HORT_READ\n", pF
13630 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
13640 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13650 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
13660 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  }..  OSTRACE(("R
13670 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
13680 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
13690 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
136a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
136b0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
136c0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
136d0 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
136e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
136f0 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
13700 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
13710 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
13720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13730 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69  winWrite(.  sqli
13740 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
13750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13760 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ile to write int
13770 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  o */.  const voi
13780 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
13790 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
137a0 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  tes to be writte
137b0 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  n */.  int amt, 
137c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
137e0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72 69   of bytes to wri
137f0 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  te */.  sqlite3_
13800 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
13810 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
13820 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20  t into the file 
13830 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67  to begin writing
13840 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   at */.){.  int 
13850 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
13860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13870 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61 73  rue if error has
13880 20 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20   occurred, else 
13890 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69  false */.  winFi
138a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
138b0 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
138c0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  le handle */.  i
138d0 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20  nt nRetry = 0;  
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
138f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72  * Number of retr
13900 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ies */..  assert
13910 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73  ( amt>0 );.  ass
13920 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13930 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
13950 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69  ERR_WRITE);.  Si
13960 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
13970 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
13980 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52  E_FULL);..  OSTR
13990 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c 65  ACE(("WRITE file
139a0 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20  =%p, buffer=%p, 
139b0 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65  amount=%d, offse
139c0 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c  t=%lld, lock=%d\
139d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
139e0 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
139f0 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c  mt, offset, pFil
13a00 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
13a10 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
13a20 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
13a30 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
13a40 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
13a50 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
13a60 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
13a70 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
13a80 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
13a90 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
13aa0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
13ab0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
13ac0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
13ad0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
13ae0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
13af0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
13b00 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
13b10 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
13b20 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
13b30 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
13b40 22 57 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65  "WRITE-MMAP file
13b50 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
13b60 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
13b70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
13b80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
13b90 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
13ba0 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69  Copy = (int)(pFi
13bb0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
13bc0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65  ffset);.      me
13bd0 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
13be0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
13bf0 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
13c00 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
13c10 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
13c20 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
13c30 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
13c40 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
13c50 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
13c60 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
13c70 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72  ITE_OS_WINCE.  r
13c80 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  c = winSeekFile(
13c90 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a  pFile, offset);.
13ca0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23    if( rc==0 ){.#
13cb0 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a  else.  {.#endif.
13cc0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
13cd0 49 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50  INCE.    OVERLAP
13ce0 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
13cf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66         /* The of
13d00 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46 69  fset for WriteFi
13d10 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  le. */.#endif.  
13d20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38    u8 *aRem = (u8
13d30 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20   *)pBuf;        
13d40 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62  /* Data yet to b
13d50 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
13d60 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b   int nRem = amt;
13d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13d80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
13d90 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74  s yet to be writ
13da0 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  ten */.    DWORD
13db0 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
13dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
13dd0 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63  s written by eac
13de0 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61  h WriteFile() ca
13df0 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  ll */.    DWORD 
13e00 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
13e10 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65  RROR;   /* Value
13e20 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74   returned by Get
13e30 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a  LastError() */..
13e40 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
13e50 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28  INCE.    memset(
13e60 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
13e70 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
13e80 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70  D));.    overlap
13e90 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
13ea0 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
13eb0 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76  fffffff);.    ov
13ec0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
13ed0 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
13ee0 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
13ef0 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a  ffffff);.#endif.
13f00 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  .    while( nRem
13f10 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  >0 ){.#if SQLITE
13f20 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20  _OS_WINCE.      
13f30 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
13f40 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
13f50 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
13f60 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20  0) ){.#else.    
13f70 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
13f80 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
13f90 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
13fa0 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29  , &overlapped) )
13fb0 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  {.#endif.       
13fc0 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65   if( winRetryIoe
13fd0 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
13fe0 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
13ff0 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ue;.        brea
14000 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
14010 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
14020 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44  =0 || nWrite<=(D
14030 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20  WORD)nRem );.   
14040 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30     if( nWrite==0
14050 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52   || nWrite>(DWOR
14060 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  D)nRem ){.      
14070 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
14080 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
14090 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
140a0 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49       }.#if !SQLI
140b0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
140c0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69    offset += nWri
140d0 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  te;.      overla
140e0 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
140f0 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
14100 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  ffffffff);.     
14110 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
14120 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
14130 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
14140 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64  x7fffffff);.#end
14150 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d  if.      aRem +=
14160 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e   nWrite;.      n
14170 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem -= nWrite;. 
14180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
14190 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69  m>0 ){.      pFi
141a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
141b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
141c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
141d0 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   }..  if( rc ){.
141e0 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c      if(   ( pFil
141f0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
14200 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f  ROR_HANDLE_DISK_
14210 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c  FULL ).       ||
14220 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   ( pFile->lastEr
14230 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f  rno==ERROR_DISK_
14240 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f  FULL )){.      O
14250 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
14260 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
14270 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65  E_FULL\n", pFile
14280 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
14290 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
142a0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69  SQLITE_FULL, pFi
142b0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
142e0 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
142f0 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53  h);.    }.    OS
14300 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69  TRACE(("WRITE fi
14310 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
14320 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c  _IOERR_WRITE\n",
14330 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14340 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14350 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14360 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  _WRITE, pFile->l
14370 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
14380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14390 20 22 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46   "winWrite2", pF
143a0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
143b0 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67  else{.    winLog
143c0 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20  Ioerr(nRetry);. 
143d0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57   }.  OSTRACE(("W
143e0 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  RITE file=%p, rc
143f0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
14400 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
14410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14420 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
14430 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
14440 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
14450 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
14460 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69  winTruncate(sqli
14470 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
14480 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
14490 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
144a0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
144b0 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
144c0 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndle object */. 
144d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
144e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
144f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
14500 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
14510 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  n */.  DWORD las
14520 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
14530 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
14540 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
14550 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14560 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f  R_TRUNCATE);.  O
14570 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
14580 45 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d  E file=%p, size=
14590 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
145a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
145b0 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46  le->h, nByte, pF
145c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
145d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
145e0 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
145f0 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
14600 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
14610 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
14620 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
14630 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
14640 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
14650 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
14660 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
14670 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
14680 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
14690 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
146a0 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
146b0 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
146c0 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
146d0 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
146e0 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
146f0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
14700 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
14710 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
14720 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  nk;.  }..  /* Se
14730 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74  tEndOfFile() ret
14740 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  urns non-zero wh
14750 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  en successful, o
14760 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66  r zero when it f
14770 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77  ails. */.  if( w
14780 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65  inSeekFile(pFile
14790 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
147a0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
147b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
147c0 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
147d0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
147f0 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70  winTruncate1", p
14800 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
14810 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53  }else if( 0==osS
14820 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c  etEndOfFile(pFil
14830 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20  e->h) &&.       
14840 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f       ((lastErrno
14850 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
14860 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52  r())!=ERROR_USER
14870 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b  _MAPPED_FILE) ){
14880 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
14890 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
148a0 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  o;.    rc = winL
148b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
148c0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70  OERR_TRUNCATE, p
148d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
148e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
148f0 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
14900 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
14910 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  th);.  }..#if SQ
14920 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
14930 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65  ZE>0.  /* If the
14940 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61   file was trunca
14950 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d  ted to a size sm
14960 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63  aller than the c
14970 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61  urrently.  ** ma
14980 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64  pped region, red
14990 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
149a0 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61  e mapping size a
149b0 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77  s well. SQLite w
149c0 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61  ill.  ** use rea
149d0 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
149e0 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
149f0 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
14a00 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20   from now on..  
14a10 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14a20 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42  pMapRegion && nB
14a30 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
14a40 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ize ){.    pFile
14a50 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79  ->mmapSize = nBy
14a60 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  te;.  }.#endif..
14a70 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
14a80 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63  CATE file=%p, rc
14a90 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
14aa0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
14ab0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
14ac0 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
14ad0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
14ae0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
14af0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
14b00 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
14b10 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
14b20 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
14b30 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
14b40 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
14b50 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
14b60 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
14b70 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
14b80 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
14b90 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
14ba0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
14bb0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
14bc0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
14bd0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
14be0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
14bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14c00 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
14c10 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
14c20 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
14c30 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
14c40 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
14c50 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
14c60 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
14c70 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
14c80 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
14c90 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
14ca0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
14cb0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
14cc0 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64 28   \.    (defined(
14cd0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
14ce0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
14cf0 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a  EBUG)).  /*.  **
14d00 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54   Used when SQLIT
14d10 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
14d20 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20   defined and by 
14d30 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64  the assert() and
14d40 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45  /or.  ** OSTRACE
14d50 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f  () macros..   */
14d60 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
14d70 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
14d80 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
14d90 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
14da0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
14db0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20  ( pFile );.  /* 
14dc0 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
14dd0 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
14de0 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
14df0 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
14e00 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
14e10 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
14e20 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
14e30 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
14e40 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
14e50 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
14e60 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
14e70 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
14e80 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
14e90 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
14ea0 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
14eb0 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
14ec0 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
14ed0 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
14ee0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
14ef0 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
14f00 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
14f10 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ..  OSTRACE(("SY
14f20 4e 43 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67  NC file=%p, flag
14f30 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  s=%x, lock=%d\n"
14f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
14f50 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70 46  le->h, flags, pF
14f60 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
14f70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
14f80 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
14f90 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
14fa0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
14fb0 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
14fc0 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
14fd0 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
14fe0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
14ff0 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
15000 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
15010 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
15020 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
15030 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
15040 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
15050 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
15060 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
15070 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54  TE_NO_SYNC.  OST
15080 52 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20  RACE(("SYNC-NOP 
15090 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
150a0 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
150b0 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
150c0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
150d0 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69    rc = osFlushFi
150e0 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d  leBuffers(pFile-
150f0 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  >h);.  SimulateI
15100 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45  OError( rc=FALSE
15110 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
15120 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59      OSTRACE(("SY
15130 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  NC file=%p, rc=S
15140 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
15150 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
15160 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
15180 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
15190 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
151a0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
151b0 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  YNC file=%p, rc=
151c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
151d0 4e 43 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  NC\n", pFile->h)
151e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
151f0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15200 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46  _IOERR_FSYNC, pF
15210 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
15220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15230 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22         "winSync"
15240 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
15250 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
15260 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
15270 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
15280 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
15290 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
152a0 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c   winFileSize(sql
152b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73  ite3_file *id, s
152c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
152d0 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  ize){.  winFile 
152e0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
152f0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
15300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
15310 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
15320 0a 20 20 61 73 73 65 72 74 28 20 70 53 69 7a 65  .  assert( pSize
15330 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
15340 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
15350 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
15360 41 54 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AT);.  OSTRACE((
15370 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70  "SIZE file=%p, p
15380 53 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  Size=%p\n", pFil
15390 65 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a  e->h, pSize));..
153a0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
153b0 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  NRT.  {.    FILE
153c0 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69  _STANDARD_INFO i
153d0 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47  nfo;.    if( osG
153e0 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
153f0 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c  nByHandleEx(pFil
15400 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61  e->h, FileStanda
15410 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  rdInfo,.        
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e               &in
15440 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
15450 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ) ){.      *pSiz
15460 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69  e = info.EndOfFi
15470 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20  le.QuadPart;.   
15480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
15490 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
154a0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
154b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
154c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
154d0 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
154e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
154f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15500 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
15510 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
15520 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
15530 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f  else.  {.    DWO
15540 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20  RD upperBits;.  
15550 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74    DWORD lowerBit
15560 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  s;.    DWORD las
15570 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77  tErrno;..    low
15580 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69  erBits = osGetFi
15590 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c  leSize(pFile->h,
155a0 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20   &upperBits);.  
155b0 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71    *pSize = (((sq
155c0 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65  lite3_int64)uppe
155d0 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f  rBits)<<32) + lo
155e0 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28  werBits;.    if(
155f0 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d     (lowerBits ==
15600 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49   INVALID_FILE_SI
15610 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28  ZE).       && ((
15620 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
15630 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
15640 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20  O_ERROR) ){.    
15650 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15660 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
15670 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
15680 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
15690 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
156a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
156b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156c0 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65      "winFileSize
156d0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
156e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
156f0 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  if.  OSTRACE(("S
15700 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69  IZE file=%p, pSi
15710 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c  ze=%p, *pSize=%l
15720 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  ld, rc=%s\n",.  
15730 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15740 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65  h, pSize, *pSize
15750 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
15760 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
15770 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f   rc;.}../*.** LO
15780 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15790 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66  DIATELY is undef
157a0 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e  ined on some Win
157b0 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dows systems..*/
157c0 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
157d0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
157e0 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  LY.# define LOCK
157f0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
15800 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a  ATELY 1.#endif..
15810 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
15820 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a  _EXCLUSIVE_LOCK.
15830 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c  # define LOCKFIL
15840 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
15850 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   2.#endif../*.**
15860 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53   Historically, S
15870 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62  QLite has used b
15880 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  oth the LockFile
15890 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20   and LockFileEx 
158a0 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68  functions..** Wh
158b0 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  en the LockFile 
158c0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65  function was use
158d0 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73  d, it was always
158e0 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69   expected to fai
158f0 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  l.** immediately
15900 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75   if the lock cou
15910 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  ld not be obtain
15920 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c  ed.  Also, it al
15930 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
15940 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78  .** obtain an ex
15950 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54  clusive lock.  T
15960 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75  hese flags are u
15970 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63  sed with the Loc
15980 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
15990 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20  .** and reflect 
159a0 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f  those expectatio
159b0 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74  ns; therefore, t
159c0 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  hey should not b
159d0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69  e changed..*/.#i
159e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
159f0 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65  KFILE_FLAGS.# de
15a00 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fine SQLITE_LOCK
15a10 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f  FILE_FLAGS   (LO
15a20 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15a30 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20  DIATELY | \.    
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f                LO
15a60 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
15a70 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f  _LOCK).#endif../
15a80 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20  *.** Currently, 
15a90 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c  SQLite never cal
15aa0 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ls the LockFileE
15ab0 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f  x function witho
15ac0 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a  ut wanting the.*
15ad0 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69  * call to fail i
15ae0 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
15af0 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  e lock cannot be
15b00 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69   obtained..*/.#i
15b10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  fndef SQLITE_LOC
15b20 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20  KFILEEX_FLAGS.# 
15b30 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f  define SQLITE_LO
15b40 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28  CKFILEEX_FLAGS (
15b50 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
15b60 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69  MEDIATELY).#endi
15b70 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  f../*.** Acquire
15b80 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a   a reader lock..
15b90 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49  ** Different API
15ba0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61   routines are ca
15bb0 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f  lled depending o
15bc0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
15bd0 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39   this.** is Win9
15be0 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73  x or WinNT..*/.s
15bf0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74  tatic int winGet
15c00 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
15c10 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
15c20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  res;.  OSTRACE((
15c30 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d  "READ-LOCK file=
15c40 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20  %p, lock=%d\n", 
15c50 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
15c60 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69  >locktype));.  i
15c70 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
15c80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15c90 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  CE.    /*.    **
15ca0 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43   NOTE: Windows C
15cb0 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66  E is handled dif
15cc0 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75  ferently here du
15cd0 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68  e its lack of th
15ce0 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20  e Win32.    **  
15cf0 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c       API LockFil
15d00 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eEx..    */.    
15d10 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46  res = winceLockF
15d20 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
15d30 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
15d40 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20  1, 0);.#else.   
15d50 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
15d60 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
15d70 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
15d80 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49  FLAGS, SHARED_FI
15d90 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  RST, 0,.        
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
15db0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23  ARED_SIZE, 0);.#
15dc0 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
15dd0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
15de0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
15df0 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73     int lk;.    s
15e00 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
15e10 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c  s(sizeof(lk), &l
15e20 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73  k);.    pFile->s
15e30 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20  haredLockByte = 
15e40 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78  (short)((lk & 0x
15e50 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45  7fffffff)%(SHARE
15e60 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20  D_SIZE - 1));.  
15e70 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
15e80 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
15e90 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
15ea0 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20  LAGS,.          
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
15ec0 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e  ED_FIRST+pFile->
15ed0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
15ee0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, 1, 0);.  }.#e
15ef0 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d  ndif.  if( res =
15f00 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
15f10 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
15f20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
15f30 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74      /* No need t
15f40 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20  o log a failure 
15f50 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20  to lock */.  }. 
15f60 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
15f70 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65  LOCK file=%p, re
15f80 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  sult=%d\n", pFil
15f90 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72  e->h, res));.  r
15fa0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
15fb0 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c  .** Undo a readl
15fc0 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ock.*/.static in
15fd0 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c  t winUnlockReadL
15fe0 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
15ff0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
16000 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
16010 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  o;.  OSTRACE(("R
16020 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  EAD-UNLOCK file=
16030 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20  %p, lock=%d\n", 
16040 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
16050 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69  >locktype));.  i
16060 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
16070 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
16080 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
16090 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
160a0 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
160b0 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  0);.  }.#ifdef S
160c0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
160d0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
160e0 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
160f0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
16100 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69  SHARED_FIRST+pFi
16110 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
16120 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
16130 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
16140 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45  es==0 && ((lastE
16150 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
16160 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f  Error())!=ERROR_
16170 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20  NOT_LOCKED) ){. 
16180 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
16190 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
161a0 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
161b0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
161c0 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  LOCK, pFile->las
161d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
161e0 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f          "winUnlo
161f0 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69  ckReadLock", pFi
16200 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
16210 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
16220 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  -UNLOCK file=%p,
16230 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70   result=%d\n", p
16240 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
16250 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
16260 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
16270 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
16280 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
16290 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
162a0 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
162b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
162c0 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
162d0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
162e0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
162f0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
16300 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
16310 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
16320 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
16330 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
16340 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
16350 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
16360 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
16370 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
16380 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
16390 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
163a0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
163b0 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
163c0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
163d0 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
163e0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
163f0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
16400 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
16410 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
16420 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
16430 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
16440 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
16450 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
16460 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
16470 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
16480 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
16490 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
164a0 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
164b0 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
164c0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
164d0 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
164e0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
164f0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
16500 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
16510 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
16520 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
16530 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
16540 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28    The winUnlock(
16550 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61  ) routine.** era
16560 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74  ses all locks at
16570 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e   once and return
16580 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  s us immediately
16590 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
165a0 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  l 0..** It is no
165b0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f  t possible to lo
165c0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
165d0 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61  level one step a
165e0 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a  t a time.  You.*
165f0 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67  * must go straig
16600 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ht to locking le
16610 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  vel 0..*/.static
16620 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c   int winLock(sql
16630 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
16640 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
16650 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16660 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  OK;    /* Return
16670 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f   code from subro
16680 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20  utines */.  int 
16690 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
166a0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20     /* Result of 
166b0 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63  a Windows lock c
166c0 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77  all */.  int new
166d0 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20  Locktype;       
166e0 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f  /* Set pFile->lo
166f0 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76  cktype to this v
16700 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74  alue before exit
16710 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74  ing */.  int got
16720 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
16730 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63  /* True if we ac
16740 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47  quired a PENDING
16750 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20   lock this time 
16760 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
16770 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
16780 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  id;.  DWORD last
16790 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
167a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
167b0 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  =0 );.  OSTRACE(
167c0 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  ("LOCK file=%p, 
167d0 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20  oldLock=%d(%d), 
167e0 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20  newLock=%d\n",. 
167f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16800 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
16810 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
16820 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b  edLockByte, lock
16830 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  type));..  /* If
16840 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
16850 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
16860 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
16870 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
16880 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
16890 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
168a0 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
168b0 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
168c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
168d0 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
168e0 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
168f0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
16900 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
16910 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f  ocktype ){.    O
16920 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45  STRACE(("LOCK-HE
16930 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  LD file=%p, rc=S
16940 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
16950 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
16960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16970 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
16980 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
16990 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
169a0 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
169b0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
169c0 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
169d0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
169e0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
169f0 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
16a00 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
16a10 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
16a20 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
16a30 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
16a40 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16a50 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50  .  /* Lock the P
16a60 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
16a70 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61   if we need to a
16a80 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
16a90 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20   lock or.  ** a 
16aa0 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66  SHARED lock.  If
16ab0 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e   we are acquirin
16ac0 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  g a SHARED lock,
16ad0 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   the acquisition
16ae0 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e   of.  ** the PEN
16af0 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
16b00 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a  s temporary..  *
16b10 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20  /.  newLocktype 
16b20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
16b30 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c  e;.  if(   (pFil
16b40 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
16b50 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20  LOCK).     || ( 
16b60 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43    (locktype==EXC
16b70 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20  LUSIVE_LOCK).   
16b80 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d        && (pFile-
16b90 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52  >locktype==RESER
16ba0 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  VED_LOCK)).  ){.
16bb0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
16bc0 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
16bd0 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69  ->0 && (res = wi
16be0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
16bf0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
16c00 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
16c40 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
16c50 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
16c60 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74  3 times to get t
16c70 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e  he pending lock.
16c80 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64    This is needed
16c90 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a   to work.      *
16ca0 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  * around problem
16cb0 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65  s caused by inde
16cc0 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69  xing and/or anti
16cd0 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20  -virus software 
16ce0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64  on.      ** Wind
16cf0 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ows systems..   
16d00 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65     ** If you are
16d10 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65   using this code
16d20 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20   as a model for 
16d30 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65  alternative VFSe
16d40 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20  s, do not.      
16d50 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74  ** copy this ret
16d60 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73  ry logic.  It is
16d70 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64   a hack intended
16d80 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c   for Windows onl
16d90 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
16da0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
16db0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
16dc0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16dd0 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49  LOCK-PENDING-FAI
16de0 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
16df0 3d 25 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e  =%d, result=%d\n
16e00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16e10 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c    pFile->h, cnt,
16e20 20 72 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66   res));.      if
16e30 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
16e40 4f 52 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  OR_INVALID_HANDL
16e50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  E ){.        pFi
16e60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16e70 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
16e80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
16e90 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
16ea0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
16eb0 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  K-FAIL file=%p, 
16ec0 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c  count=%d, rc=%s\
16ed0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
16ee0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63       pFile->h, c
16ef0 6e 74 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  nt, sqlite3ErrNa
16f00 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
16f10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16f20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
16f30 6e 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e  nt ) sqlite3_win
16f40 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20  32_sleep(1);.   
16f50 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e   }.    gotPendin
16f60 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20  gLock = res;.   
16f70 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20   if( !res ){.   
16f80 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
16f90 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
16fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16fb0 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65   Acquire a share
16fc0 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  d lock.  */.  if
16fd0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
16fe0 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
16ff0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
17000 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
17010 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  O_LOCK );.    re
17020 73 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  s = winGetReadLo
17030 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  ck(pFile);.    i
17040 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
17050 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48  newLocktype = SH
17060 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
17070 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
17080 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
17090 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
170a0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
170b0 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
170c0 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
170d0 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
170e0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
170f0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
17100 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
17110 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
17120 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
17130 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
17140 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
17150 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
17160 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
17170 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
17180 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
17190 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
171a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
171b0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
171c0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
171d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
171e0 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
171f0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
17200 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
17210 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
17220 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
17230 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
17240 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
17250 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
17260 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
17270 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
17280 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
17290 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
172a0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
172b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
172c0 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  ocktype>=SHARED_
172d0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
172e0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c  = winUnlockReadL
172f0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
17300 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
17310 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
17320 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
17330 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
17340 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
17350 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17360 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
17370 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
17380 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
17390 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
173a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
173b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
173c0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
173d0 20 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f      winGetReadLo
173e0 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ck(pFile);.    }
173f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
17400 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50   are holding a P
17410 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74  ENDING lock that
17420 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c   ought to be rel
17430 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  eased, then.  **
17440 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   release it now.
17450 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50  .  */.  if( gotP
17460 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f  endingLock && lo
17470 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
17480 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
17490 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
174a0 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
174b0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
174c0 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
174d0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f   state of the lo
174e0 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74  ck has held in t
174f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17500 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74  or then.  ** ret
17510 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
17520 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  ate result code.
17530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20  .  */.  if( res 
17540 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
17550 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
17560 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
17570 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
17580 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17590 45 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52  E_BUSY;.    OSTR
175a0 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20  ACE(("LOCK-FAIL 
175b0 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d  file=%p, wanted=
175c0 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20  %d, got=%d\n",. 
175d0 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
175e0 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  e->h, locktype, 
175f0 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  newLocktype));. 
17600 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
17610 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f  type = (u8)newLo
17620 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43  cktype;.  OSTRAC
17630 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
17640 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73  , lock=%d, rc=%s
17650 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17660 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
17670 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74  >locktype, sqlit
17680 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
17690 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
176a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
176b0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
176c0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
176d0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
176e0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
176f0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
17700 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
17710 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
17720 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
17730 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f  n.** non-zero, o
17740 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a  therwise zero..*
17750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17760 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
17770 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17780 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
17790 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
177a0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
177b0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a   (winFile*)id;..
177c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
177d0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
177e0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
177f0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f  RVEDLOCK; );.  O
17800 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
17810 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
17820 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46  ResOut=%p\n", pF
17830 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29  ile->h, pResOut)
17840 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
17850 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
17860 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
17870 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
17880 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
17890 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
178a0 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
178b0 72 65 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c  result=%d (local
178c0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
178d0 72 65 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  res));.  }else{.
178e0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
178f0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17900 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17910 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45  EX_FLAGS,RESERVE
17920 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
17930 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
17940 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  .      winUnlock
17950 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17960 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
17970 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
17980 20 20 20 72 65 73 20 3d 20 21 72 65 73 3b 0a 20     res = !res;. 
17990 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
179a0 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
179b0 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28 72 65  p, result=%d (re
179c0 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  mote)\n", pFile-
179d0 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20  >h, res));.  }. 
179e0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 3b   *pResOut = res;
179f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
17a00 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
17a10 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a  p, pResOut=%p, *
17a20 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53  pResOut=%d, rc=S
17a30 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
17a40 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
17a50 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
17a60 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
17a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17a80 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
17a90 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
17aa0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
17ab0 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  d to locktype.  
17ac0 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
17ad0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
17ae0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
17af0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
17b00 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
17b10 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
17b20 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
17b30 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
17b40 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
17b50 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
17b60 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
17b70 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  -op..**.** It is
17b80 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
17b90 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
17ba0 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65  o fail if the se
17bb0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
17bc0 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66   is NO_LOCK.  If
17bd0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17be0 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c  ment is SHARED_L
17bf0 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OCK then this ro
17c00 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72  utine.** might r
17c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
17c20 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  RR;.*/.static in
17c30 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69  t winUnlock(sqli
17c40 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17c50 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
17c60 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69  nt type;.  winFi
17c70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
17c80 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
17c90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17ca0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
17cb0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17cc0 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
17cd0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41  _LOCK );.  OSTRA
17ce0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65  CE(("UNLOCK file
17cf0 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
17d00 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
17d10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
17d20 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17d30 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
17d40 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
17d50 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 74   locktype));.  t
17d60 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
17d70 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70  ktype;.  if( typ
17d80 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e>=EXCLUSIVE_LOC
17d90 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
17da0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17db0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17dc0 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
17dd0 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  0);.    if( lock
17de0 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
17df0 4b 20 26 26 20 21 77 69 6e 47 65 74 52 65 61 64  K && !winGetRead
17e00 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20  Lock(pFile) ){. 
17e10 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
17e20 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
17e30 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77  .  We should alw
17e40 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20  ays be able to. 
17e50 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72       ** reacquir
17e60 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  e the read lock 
17e70 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  */.      rc = wi
17e80 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
17e90 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f  _IOERR_UNLOCK, o
17ea0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
17eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ec0 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f          "winUnlo
17ed0 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
17ee0 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  h);.    }.  }.  
17ef0 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52 56  if( type>=RESERV
17f00 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
17f10 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
17f20 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
17f30 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
17f40 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74  .  }.  if( lockt
17f50 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ype==NO_LOCK && 
17f60 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
17f70 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
17f80 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
17f90 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70  );.  }.  if( typ
17fa0 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  e>=PENDING_LOCK 
17fb0 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
17fc0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
17fd0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c  PENDING_BYTE, 0,
17fe0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46   1, 0);.  }.  pF
17ff0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
18000 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
18010 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
18020 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
18030 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
18040 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
18050 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
18060 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
18070 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
18080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
18090 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69  f *pArg is initi
180a0 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20  tially negative 
180b0 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71  then this is a q
180c0 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67  uery.  Set *pArg
180d0 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65   to.** 1 or 0 de
180e0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
180f0 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61  er or not bit ma
18100 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  sk of pFile->ctr
18110 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a  lFlags is set..*
18120 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
18130 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c   0 or 1, then cl
18140 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d  ear or set the m
18150 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65  ask bit of pFile
18160 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a  ->ctrlFlags..*/.
18170 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
18180 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a  odeBit(winFile *
18190 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20  pFile, unsigned 
181a0 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a  char mask, int *
181b0 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41  pArg){.  if( *pA
181c0 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72  rg<0 ){.    *pAr
181d0 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  g = (pFile->ctrl
181e0 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30  Flags & mask)!=0
181f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a  ;.  }else if( (*
18200 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  pArg)==0 ){.    
18210 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
18220 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c   &= ~mask;.  }el
18230 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63  se{.    pFile->c
18240 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b  trlFlags |= mask
18250 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ;.  }.}../* Forw
18260 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
18270 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74  o VFS helper met
18280 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74 65  hods used for te
18290 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f  mporary files */
182a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
182b0 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74  etTempname(sqlit
182c0 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20 2a  e3_vfs *, char *
182d0 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  *);.static int w
182e0 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76 6f  inIsDir(const vo
182f0 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 4f  id *);.static BO
18300 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  OL winIsDriveLet
18310 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e 73  terAndColon(cons
18320 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a  t char *);../*.*
18330 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75  * Control and qu
18340 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ery of the open 
18350 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
18360 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
18370 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
18380 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18390 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
183a0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
183b0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
183c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 43  ;.  OSTRACE(("FC
183d0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70 3d  NTL file=%p, op=
183e0 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c 20  %d, pArg=%p\n", 
183f0 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70 41  pFile->h, op, pA
18400 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28 20  rg));.  switch( 
18410 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
18420 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b  QLITE_FCNTL_LOCK
18430 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a  STATE: {.      *
18440 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
18450 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
18460 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18470 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18480 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18490 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
184a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
184b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
184c0 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
184d0 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
184e0 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70  t*)pArg = (int)p
184f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
18500 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18510 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
18520 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
18530 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
18540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18550 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
18560 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18570 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
18580 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
18590 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
185a0 72 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  rg;.      OSTRAC
185b0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
185c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
185d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
185e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
185f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
18600 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18610 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
18620 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65  .      if( pFile
18630 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
18640 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
18650 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20  nt64 oldSz;.    
18660 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
18670 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c  FileSize(id, &ol
18680 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  dSz);.        if
18690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
186a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
186b0 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a  ite3_int64 newSz
186c0 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
186d0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
186e0 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c      if( newSz>ol
186f0 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  dSz ){.         
18700 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18710 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
18720 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
18730 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65  nTruncate(id, ne
18740 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wSz);.          
18750 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18760 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
18770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18780 7d 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  }.        OSTRAC
18790 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
187a0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69  p, rc=%s\n", pFi
187b0 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72  le->h, sqlite3Er
187c0 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
187d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
187e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
187f0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18800 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18810 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18820 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18830 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18840 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18850 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
18860 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  WAL: {.      win
18870 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
18880 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57  INFILE_PERSIST_W
18890 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b  AL, (int*)pArg);
188a0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
188b0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
188c0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
188d0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
188e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
188f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
18900 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18910 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
18920 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69  RITE: {.      wi
18930 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
18940 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69  WINFILE_PSOW, (i
18950 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
18960 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
18970 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
18980 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18990 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
189a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
189b0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
189c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41  LITE_FCNTL_VFSNA
189d0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68  ME: {.      *(ch
189e0 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  ar**)pArg = sqli
189f0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
18a00 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a  , pFile->pVfs->z
18a10 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54  Name);.      OST
18a20 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
18a30 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
18a40 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
18a50 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
18a60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18a70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18a80 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f  _FCNTL_WIN32_AV_
18a90 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69  RETRY: {.      i
18aa0 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41  nt *a = (int*)pA
18ab0 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b  rg;.      if( a[
18ac0 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0]>0 ){.        
18ad0 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20  winIoerrRetry = 
18ae0 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  a[0];.      }els
18af0 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20  e{.        a[0] 
18b00 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b  = winIoerrRetry;
18b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18b20 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
18b30 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74       winIoerrRet
18b40 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
18b50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18b60 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49       a[1] = winI
18b70 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
18b80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53        }.      OS
18b90 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18ba0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18bb0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18bc0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18be0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
18bf0 54 45 53 54 0a 20 20 20 20 63 61 73 65 20 53 51  TEST.    case SQ
18c00 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
18c10 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20  _SET_HANDLE: {. 
18c20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68       LPHANDLE ph
18c30 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45  File = (LPHANDLE
18c40 29 70 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e  )pArg;.      HAN
18c50 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70  DLE hOldFile = p
18c60 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70  File->h;.      p
18c70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c  File->h = *phFil
18c80 65 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65  e;.      *phFile
18c90 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20   = hOldFile;.   
18ca0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
18cb0 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e  TL oldFile=%p, n
18cc0 65 77 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  ewFile=%p, rc=SQ
18cd0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
18ce0 20 20 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46             hOldF
18cf0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
18d00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18d10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
18d20 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 53  endif.    case S
18d30 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
18d40 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
18d50 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
18d60 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   0;.      int rc
18d70 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d   = winGetTempnam
18d80 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26  e(pFile->pVfs, &
18d90 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  zTFile);.      i
18da0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18db0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68   ){.        *(ch
18dc0 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
18dd0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
18de0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18df0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
18e00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
18e10 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
18e20 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
18e30 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20  n rc;.    }.#if 
18e40 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
18e50 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
18e60 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
18e70 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
18e80 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
18e90 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
18ea0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18eb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
18ec0 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
18ed0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
18ee0 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
18ef0 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
18f00 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
18f10 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mmap;.      }.  
18f20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
18f30 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
18f40 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
18f50 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
18f60 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
18f70 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
18f80 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
18f90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
18fa0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
18fb0 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
18fc0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
18fd0 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
18fe0 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70          winUnmap
18ff0 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
19000 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d         rc = winM
19010 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
19020 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
19030 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
19040 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
19050 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
19060 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
19070 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
19080 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19090 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
190a0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
190b0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
190c0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22  LITE_NOTFOUND\n"
190d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
190e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
190f0 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
19100 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
19110 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
19120 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
19130 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
19140 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
19150 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
19160 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
19170 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
19180 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
19190 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
191a0 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
191b0 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
191c0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
191d0 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
191e0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
191f0 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
19200 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
19210 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
19220 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
19230 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
19240 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
19250 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
19260 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19270 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
19280 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
19290 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
192a0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
192b0 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69   *id){.  (void)i
192c0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
192d0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
192e0 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
192f0 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72   Return a vector
19300 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61   of device chara
19310 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73  cteristics..*/.s
19320 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76  tatic int winDev
19330 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
19340 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
19350 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  *id){.  winFile 
19360 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  *p = (winFile*)i
19370 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
19380 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
19390 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c  ABLE_WHEN_OPEN |
193a0 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63  .         ((p->c
193b0 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
193c0 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f  LE_PSOW)?SQLITE_
193d0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
193e0 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a  OVERWRITE:0);.}.
193f0 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  ./*.** Windows w
19400 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
19410 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
19420 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
19430 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
19440 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
19450 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
19460 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
19470 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
19480 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
19490 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
194a0 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
194b0 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e  static SYSTEM_IN
194c0 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
194d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
194e0 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
194f0 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
19500 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
19510 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
19520 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
19530 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
19540 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
19550 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
19560 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
19570 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20  y.** this file, 
19580 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
19590 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
195a0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
195b0 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
195c0 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
195d0 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
195e0 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
195f0 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73  obal mutex.** is
19600 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
19610 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
19620 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
19630 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
19640 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
19650 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
19660 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
19670 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
19680 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
19690 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
196a0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
196b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
196c0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76  nShmEnterMutex(v
196d0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
196e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
196f0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
19700 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19710 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74  C_MASTER));.}.st
19720 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
19730 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29  LeaveMutex(void)
19740 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
19750 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 4d  x_leave(sqlite3M
19760 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
19770 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
19780 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 6e 64 65  STER));.}.#ifnde
19790 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
197a0 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
197b0 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
197c0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
197d0 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
197e0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
197f0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
19800 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
19810 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
19820 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
19830 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
19840 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
19850 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
19860 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
19870 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
19880 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
19890 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
198a0 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
198b0 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
198c0 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
198d0 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
198e0 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
198f0 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
19900 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
19910 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19920 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
19930 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
19940 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
19950 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
19960 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
19970 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
19980 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
19990 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
199a0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
199b0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
199c0 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
199d0 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
199e0 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
199f0 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pNext.**.** The 
19a00 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
19a10 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
19a20 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
19a30 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  is created:.**.*
19a40 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
19a50 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
19a60 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
19a70 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
19a80 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
19a90 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
19aa0 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
19ab0 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
19ac0 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
19ad0 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
19ae0 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
19af0 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
19b00 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
19b10 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
19b20 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
19b30 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
19b40 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
19b50 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
19b60 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
19b70 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19b80 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
19b90 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
19ba0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
19bb0 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
19bc0 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
19bd0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
19be0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
19bf0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
19c00 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
19c10 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
19c20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
19c30 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
19c40 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
19c50 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
19c60 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
19c70 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
19c80 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
19c90 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
19ca0 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
19cb0 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
19cc0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
19cd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
19ce0 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
19cf0 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
19d00 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
19d10 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
19d20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19d30 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
19d40 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
19d50 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
19d60 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
19d70 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
19d80 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
19d90 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
19da0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
19db0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
19dc0 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
19dd0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
19de0 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  cts */.#ifdef SQ
19df0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
19e00 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
19e10 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
19e20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d  available winShm
19e30 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
19e40 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
19e50 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20  global array of 
19e60 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
19e70 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  bjects..**.** Th
19e80 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  e winShmMutexHel
19e90 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
19ea0 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
19eb0 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c  r writing this l
19ec0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77  ist..*/.static w
19ed0 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68  inShmNode *winSh
19ee0 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  mNodeList = 0;..
19ef0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
19f00 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
19f10 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
19f20 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
19f30 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
19f40 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
19f50 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
19f60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
19f70 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
19f80 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
19f90 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
19fa0 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
19fb0 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
19fc0 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  **.**    winShm.
19fd0 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77  pShmNode.**    w
19fe0 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  inShm.id.**.** A
19ff0 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
1a000 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
1a010 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d   The winShm.pShm
1a020 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  Node->mutex must
1a030 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
1a040 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
1a050 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
1a060 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  s..*/.struct win
1a070 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  Shm {.  winShmNo
1a080 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
1a090 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1a0a0 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ying winShmNode 
1a0b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53  object */.  winS
1a0c0 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
1a0d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77         /* Next w
1a0e0 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  inShm with the s
1a0f0 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ame winShmNode *
1a100 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a120 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
1a130 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  g the winShmNode
1a140 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
1a150 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
1a160 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1a170 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
1a180 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
1a190 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
1a1a0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
1a1b0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
1a1c0 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
1a1d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
1a1e0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
1a1f0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
1a200 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1a210 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d   with its winShm
1a220 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  Node */.#endif.}
1a230 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
1a240 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
1a250 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing.*/.#define W
1a260 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IN_SHM_BASE   ((
1a270 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
1a280 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f  OCK)*4)        /
1a290 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
1a2a0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
1a2b0 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e  _SHM_DMS    (WIN
1a2c0 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
1a2d0 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
1a2e0 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
1a2f0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  /../*.** Apply a
1a300 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
1a310 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65  r all n bytes be
1a320 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e  ginning at ofst.
1a330 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d  .*/.#define _SHM
1a340 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
1a350 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a  e _SHM_RDLCK  2.
1a360 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c  #define _SHM_WRL
1a370 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74  CK  3.static int
1a380 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1a390 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  k(.  winShmNode 
1a3a0 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70  *pFile,    /* Ap
1a3b0 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
1a3c0 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
1a3d0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
1a3e0 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
1a3f0 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f          /* _SHM_
1a400 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43  UNLCK, _SHM_RDLC
1a410 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b  K, or _SHM_WRLCK
1a420 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
1a430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a440 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
1a450 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
1a460 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  /unlocked */.  i
1a470 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
1a480 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a490 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
1a4a0 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
1a4b0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1a4c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1a4d0 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
1a4e0 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
1a4f0 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
1a500 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
1a510 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
1a520 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
1a530 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
1a540 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1a550 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
1a560 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
1a570 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  f==0 );..  OSTRA
1a580 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
1a590 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
1a5a0 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d  offset=%d, size=
1a5b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1a5c0 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
1a5d0 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74  , lockType, ofst
1a5e0 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a  , nByte));..  /*
1a5f0 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
1a600 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
1a610 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
1a620 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
1a630 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
1a640 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
1a650 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1a660 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
1a670 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1a680 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1a690 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
1a6a0 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
1a6b0 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
1a6c0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
1a6d0 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
1a6e0 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
1a6f0 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
1a700 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
1a710 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
1a720 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
1a730 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
1a740 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
1a750 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
1a760 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20    }..  if( rc!= 
1a770 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1a780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1a790 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
1a7a0 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c  tErrno =  osGetL
1a7b0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1a7c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1a7d0 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
1a7e0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65  (("SHM-LOCK file
1a7f0 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72  =%p, func=%s, er
1a800 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e  rno=%lu, rc=%s\n
1a810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
1a820 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c  ile->hFile.h, (l
1a830 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
1a840 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c  UNLCK) ? "winUnl
1a850 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20  ockFile" :.     
1a860 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69        "winLockFi
1a870 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  le", pFile->last
1a880 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72  Errno, sqlite3Er
1a890 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20  rName(rc)));..  
1a8a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a8b0 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
1a8c0 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f  ces to VFS metho
1a8d0 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ds */.static int
1a8e0 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33   winOpen(sqlite3
1a8f0 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72  _vfs*,const char
1a900 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  *,sqlite3_file*,
1a910 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69  int,int*);.stati
1a920 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
1a930 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f  sqlite3_vfs *,co
1a940 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a  nst char*,int);.
1a950 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
1a960 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1a970 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72  list of all entr
1a980 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e  ies with winShmN
1a990 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ode.nRef==0..**.
1a9a0 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
1a9b0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1a9c0 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
1a9d0 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
1a9e0 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
1a9f0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1aa00 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
1aa10 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1aa20 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76  mPurge(sqlite3_v
1aa30 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65  fs *pVfs, int de
1aa40 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e  leteFlag){.  win
1aa50 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20  ShmNode **pp;.  
1aa60 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20  winShmNode *p;. 
1aa70 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
1aa80 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
1aa90 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1aaa0 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c  RGE pid=%lu, del
1aab0 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20  eteFlag=%d\n",. 
1aac0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1aad0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1aae0 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b  ), deleteFlag));
1aaf0 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e  .  pp = &winShmN
1ab00 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65  odeList;.  while
1ab10 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29  ( (p = *pp)!=0 )
1ab20 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65  {.    if( p->nRe
1ab30 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  f==0 ){.      in
1ab40 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t i;.      if( p
1ab50 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74  ->mutex ){ sqlit
1ab60 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
1ab70 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20  >mutex); }.     
1ab80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
1ab90 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Region; i++){.  
1aba0 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d        BOOL bRc =
1abb0 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
1abc0 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
1abd0 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
1abe0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1abf0 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c  RGE-UNMAP pid=%l
1ac00 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
1ac10 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1ac20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1ac30 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1ac40 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
1ac50 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1ac60 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52        UNUSED_VAR
1ac70 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29  IABLE_VALUE(bRc)
1ac80 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  ;.        bRc = 
1ac90 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d  osCloseHandle(p-
1aca0 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70  >aRegion[i].hMap
1acb0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
1acc0 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43  CE(("SHM-PURGE-C
1acd0 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  LOSE pid=%lu, re
1ace0 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  gion=%d, rc=%s\n
1acf0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1ad00 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1ad10 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20  ProcessId(), i, 
1ad20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
1ad30 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20  iled"));.       
1ad40 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45   UNUSED_VARIABLE
1ad50 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20  _VALUE(bRc);.   
1ad60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1ad70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20  ->hFile.h!=NULL 
1ad80 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49  && p->hFile.h!=I
1ad90 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1ada0 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53  LUE ){.        S
1adb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1adc0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1add0 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74   winClose((sqlit
1ade0 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46  e3_file *)&p->hF
1adf0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69  ile);.        Si
1ae00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ae10 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1ae20 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65        if( delete
1ae30 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1ae40 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1ae50 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1ae60 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1ae70 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1ae80 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28        winDelete(
1ae90 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61  pVfs, p->zFilena
1aea0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
1aeb0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
1aec0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1aed0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1aee0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1aef0 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20    }.      *pp = 
1af00 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
1af10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
1af20 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  aRegion);.      
1af30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1af40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1af50 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74    pp = &p->pNext
1af60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1af70 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68  *.** Open the sh
1af80 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
1af90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1afa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1afb0 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  DbFd..**.** When
1afc0 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
1afd0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1afe0 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
1aff0 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
1b000 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
1b010 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
1b020 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
1b030 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
1b040 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
1b050 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
1b060 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
1b070 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
1b080 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
1b090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b0a0 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1b0b0 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62  ory(winFile *pDb
1b0c0 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  Fd){.  struct wi
1b0d0 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20  nShm *p;        
1b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b0f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
1b100 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
1b110 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
1b120 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20  *pShmNode = 0;  
1b130 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1b140 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
1b150 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b180 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75  t code */.  stru
1b190 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  ct winShmNode *p
1b1a0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f  New;           /
1b1b0 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
1b1c0 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  d winShmNode */.
1b1d0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b200 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a  zName in bytes *
1b210 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  /..  assert( pDb
1b220 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20  Fd->pShm==0 );  
1b230 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75    /* Not previou
1b240 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20  sly opened */.. 
1b250 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
1b260 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ce for the new s
1b270 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63  qlite3_shm objec
1b280 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61  t.  Also specula
1b290 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  tively.  ** allo
1b2a0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61  cate space for a
1b2b0 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20   new winShmNode 
1b2c0 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  and filename..  
1b2d0 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  */.  p = sqlite3
1b2e0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1b2f0 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
1b300 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
1b310 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1b320 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  nName = sqli
1b330 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46  te3Strlen30(pDbF
1b340 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65  d->zPath);.  pNe
1b350 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  w = sqlite3Mallo
1b360 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
1b370 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65  ShmNode) + nName
1b380 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70   + 17 );.  if( p
1b390 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
1b3a0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1b3b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b3c0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1b3d0 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  }.  pNew->zFilen
1b3e0 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
1b3f0 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33  ew[1];.  sqlite3
1b400 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b  _snprintf(nName+
1b410 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  15, pNew->zFilen
1b420 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70  ame, "%s-shm", p
1b430 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1b440 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
1b450 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
1b460 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1b470 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f  );..  /* Look to
1b480 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
1b490 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e   an existing win
1b4a0 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e  ShmNode that can
1b4b0 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49   be used..  ** I
1b4c0 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69  f no matching wi
1b4d0 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74  nShmNode current
1b4e0 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74  ly exists, creat
1b4f0 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
1b500 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1b510 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53  utex();.  for(pS
1b520 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e  hmNode = winShmN
1b530 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64  odeList; pShmNod
1b540 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d  e; pShmNode=pShm
1b550 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Node->pNext){.  
1b560 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f    /* TBD need to
1b570 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65   come up with be
1b580 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e  tter match here.
1b590 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a    Perhaps.    **
1b5a0 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54   use FILE_ID_BOT
1b5b0 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63  H_DIR_INFO Struc
1b5c0 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
1b5d0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1b5e0 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  Cmp(pShmNode->zF
1b5f0 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  ilename, pNew->z
1b600 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62  Filename)==0 ) b
1b610 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1b620 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20  pShmNode ){.    
1b630 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1b640 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  w);.  }else{.   
1b650 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77   pShmNode = pNew
1b660 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1b670 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28      ((winFile*)(
1b680 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1b690 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  ))->h = INVALID_
1b6a0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20  HANDLE_VALUE;.  
1b6b0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78    pShmNode->pNex
1b6c0 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  t = winShmNodeLi
1b6d0 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f  st;.    winShmNo
1b6e0 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64  deList = pShmNod
1b6f0 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  e;..    pShmNode
1b700 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1b710 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1b720 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1b730 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1b740 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1b750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b760 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1b770 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1b780 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
1b790 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28     rc = winOpen(
1b7a0 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20  pDbFd->pVfs,.   
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
1b7c0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1b7d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
1b7e0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1b7f0 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b810 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
1b820 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1b830 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
1b840 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  here */.        
1b850 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b860 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54  OPEN_WAL | SQLIT
1b870 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b880 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1b890 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20  REATE,.         
1b8a0 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
1b8b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1b8c0 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
1b8d0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1b8e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
1b8f0 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
1b900 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
1b910 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
1b920 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
1b930 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63  ** If not, trunc
1b940 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
1b950 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20  zero length..   
1b960 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53   */.    if( winS
1b970 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1b980 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
1b990 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1b9a0 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
1b9b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
1b9c0 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
1b9d0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1b9e0 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20  e->hFile, 0);.  
1b9f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ba00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ba10 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1ba20 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1ba30 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73  HMOPEN, osGetLas
1ba40 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c     "winOpenShm",
1ba70 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1ba80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ba90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1baa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  _OK ){.      win
1bab0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1bac0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1bad0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1bae0 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
1baf0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1bb00 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1bb10 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  RDLCK, WIN_SHM_D
1bb20 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  MS, 1);.    }.  
1bb30 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1bb40 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1bb50 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
1bb60 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
1bb70 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77  a child of the w
1bb80 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  inShmNode */.  p
1bb90 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
1bba0 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
1bbb0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
1bbc0 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
1bbd0 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
1bbe0 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
1bbf0 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
1bc00 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53  pShm = p;.  winS
1bc10 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  hmLeaveMutex();.
1bc20 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65  .  /* The refere
1bc30 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68  nce count on pSh
1bc40 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64  mNode has alread
1bc50 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74  y been increment
1bc60 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68  ed under.  ** th
1bc70 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77  e cover of the w
1bc80 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1bc90 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20  ) mutex and the 
1bca0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
1bcb0 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63  .  ** new (struc
1bcc0 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74  t winShm) object
1bcd0 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65   to the pShmNode
1bce0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41   has been set. A
1bcf0 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  ll that is.  ** 
1bd00 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f  left to do is to
1bd10 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62   link the new ob
1bd20 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ject into the li
1bd30 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69  nked list starti
1bd40 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e  ng.  ** at pShmN
1bd50 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69  ode->pFirst. Thi
1bd60 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77  s must be done w
1bd70 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  hile holding the
1bd80 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1bd90 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
1bda0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1bdb0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1bdc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
1bdd0 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
1bde0 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
1bdf0 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
1be00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1be10 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1be20 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1be30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
1be40 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
1be50 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
1be60 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
1be70 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1be80 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
1be90 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1bea0 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
1beb0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1bec0 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
1bed0 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1bee0 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1bef0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1bf00 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
1bf10 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
1bf20 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1bf30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1bf40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1bf50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
1bf60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
1bf70 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
1bf80 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ying.** storage 
1bf90 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
1bfa0 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1bfb0 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
1bfc0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1bfd0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1bfe0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1bff0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1c000 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
1c010 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
1c020 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
1c030 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
1c040 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1c050 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
1c060 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1c070 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1c080 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
1c090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c0a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1c0b0 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
1c0c0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1c0d0 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
1c0e0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
1c0f0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1c100 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
1c110 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1c120 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1c130 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1c140 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
1c150 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
1c160 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
1c170 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1c180 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
1c190 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1c1a0 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
1c1b0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1c1c0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1c1d0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1c1e0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1c1f0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1c200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c210 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1c220 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1c230 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1c240 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1c250 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1c260 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1c270 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1c280 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1c290 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1c2a0 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1c2b0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1c2c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1c2d0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1c2e0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1c2f0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1c300 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1c310 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1c320 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1c330 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1c340 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1c350 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1c360 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1c370 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1c380 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1c390 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1c3a0 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
1c3b0 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1c3c0 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
1c3d0 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
1c3e0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
1c3f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c400 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1c410 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1c420 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1c430 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
1c440 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
1c450 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
1c460 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1c470 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1c480 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1c490 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1c4a0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1c4b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c4c0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
1c4d0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1c4e0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c500 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
1c510 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
1c520 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1c530 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1c540 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
1c550 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
1c560 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
1c570 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1c580 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
1c590 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1c5a0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1c5b0 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1c5c0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1c5d0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1c5e0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
1c5f0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
1c600 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
1c610 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c630 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1c640 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
1c650 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1c660 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1c670 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1c680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1c690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1c6b0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1c6e0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
1c6f0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
1c700 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
1c710 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
1c720 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1c730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
1c740 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
1c750 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1c760 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1c770 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1c780 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1c790 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1c7a0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1c7b0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
1c7c0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1c7d0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1c7e0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1c7f0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1c800 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1c810 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1c820 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
1c830 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1c840 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1c850 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
1c860 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
1c870 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
1c880 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
1c890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
1c8a0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
1c8b0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
1c8c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1c8d0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1c8e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1c8f0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
1c900 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
1c910 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
1c920 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1c930 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
1c940 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
1c950 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
1c960 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
1c970 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1c980 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1c990 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1c9a0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
1c9b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1c9c0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
1c9d0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
1c9e0 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
1c9f0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
1ca00 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
1ca10 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1ca20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
1ca30 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
1ca40 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
1ca50 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
1ca60 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1ca70 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1ca80 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1ca90 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
1caa0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1cab0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
1cac0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cad0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
1cae0 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
1caf0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1cb00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cb10 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
1cb20 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
1cb30 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
1cb40 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
1cb50 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1cb60 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1cb70 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
1cb80 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
1cb90 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
1cba0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
1cbb0 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
1cbc0 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
1cbd0 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
1cbe0 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
1cbf0 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
1cc00 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
1cc10 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
1cc20 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
1cc30 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
1cc40 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
1cc50 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
1cc60 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
1cc70 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
1cc80 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1cc90 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1cca0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1ccb0 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
1ccc0 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
1ccd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1cce0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1ccf0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1cd00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
1cd10 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
1cd20 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
1cd30 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
1cd40 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
1cd50 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
1cd60 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
1cd70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cd80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1cd90 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
1cda0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1cdb0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1cdc0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1cdd0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66  , _SHM_RDLCK, of
1cde0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1cdf0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
1ce00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ce10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1ce20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1ce30 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
1ce40 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
1ce50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ce60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1ce70 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
1ce80 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
1ce90 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
1cea0 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
1ceb0 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
1cec0 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
1ced0 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
1cee0 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
1cef0 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
1cf00 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
1cf10 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
1cf20 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1cf30 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1cf40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1cf50 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1cf60 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
1cf70 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
1cf80 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
1cf90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cfa0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1cfb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1cfc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1cfd0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
1cfe0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
1cff0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
1d000 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
1d010 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
1d020 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
1d030 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
1d040 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
1d050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d060 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d070 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1d080 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1d090 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  WRLCK, ofst+WIN_
1d0a0 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1d0b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d0d0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
1d0e0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
1d0f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
1d100 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
1d110 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1d120 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1d130 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1d140 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
1d150 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1d160 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25 64  K pid=%lu, id=%d
1d170 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30 33  , sharedMask=%03
1d180 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33 78  x, exclMask=%03x
1d190 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1d1a0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1d1b0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1d1c0 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65 64  p->id, p->shared
1d1d0 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
1d1e0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  k,.           sq
1d1f0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1d200 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1d210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
1d220 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
1d230 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
1d240 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
1d250 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  emory..**.** All
1d260 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65   loads and store
1d270 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74  s begun before t
1d280 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20  he barrier must 
1d290 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a  complete before.
1d2a0 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73  ** any load or s
1d2b0 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72  tore begun after
1d2c0 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f   the barrier..*/
1d2d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1d2e0 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
1d2f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
1d300 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1d310 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
1d320 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1d330 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
1d340 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a  AMETER(fd);.  /*
1d350 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29   MemoryBarrier()
1d360 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f  ; // does not wo
1d370 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f  rk -- do not kno
1d380 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77  w why not */.  w
1d390 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1d3a0 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
1d3b0 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
1d3c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1d3d0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
1d3e0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
1d3f0 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20   region iRegion 
1d400 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64  of the.** shared
1d410 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
1d420 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
1d430 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
1d440 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1d450 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ons.** are numbe
1d460 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1d470 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1d480 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1d490 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a  n is szRegion.**
1d4a0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1d4b0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1d4c0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1d4d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1d4e0 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
1d4f0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1d500 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1d510 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61  the isWrite para
1d520 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
1d530 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1d540 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
1d550 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
1d560 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
1d570 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
1d580 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
1d590 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
1d5a0 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
1d5b0 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
1d5c0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1d5d0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a  OK returned. If.
1d5e0 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f  ** isWrite is no
1d5f0 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
1d600 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
1d610 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1d620 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65  s not yet.** bee
1d630 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1d640 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
1d650 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1d660 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
1d670 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1d680 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d690 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
1d6a0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
1d6b0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
1d6c0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
1d6d0 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
1d6e0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
1d6f0 65 73 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73  esses.** address
1d700 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
1d710 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
1d720 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
1d730 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
1d740 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
1d750 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1d760 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1d770 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71   winShmMap(.  sq
1d780 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d7a0 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
1d7b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1d7c0 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
1d7f0 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
1d800 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
1d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d820 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
1d830 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74   */.  int isWrit
1d840 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1d850 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1d860 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
1d870 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
1d880 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
1d890 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1d8a0 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
1d8b0 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  mory */.){.  win
1d8c0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1d8d0 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69  inFile*)fd;.  wi
1d8e0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
1d8f0 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
1d900 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
1d910 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d920 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29  _OK;..  if( !p )
1d930 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
1d940 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1d950 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1d960 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1d970 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20  eturn rc;.    p 
1d980 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1d990 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20   }.  pShmNode = 
1d9a0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
1d9b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1d9c0 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1d9d0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1d9e0 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
1d9f0 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
1da00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1da10 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
1da20 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1da30 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
1da40 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
1da50 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20  n *apNew;       
1da60 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69      /* New aRegi
1da70 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
1da80 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
1da90 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
1daa0 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
1dab0 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
1dac0 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
1dad0 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20  3_int64 sz;     
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1daf0 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
1db00 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a  wal-index file *
1db10 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
1db20 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
1db30 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
1db40 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1db50 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
1db60 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1db70 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
1db80 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
1db90 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
1dba0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1dbb0 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
1dbc0 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
1dbd0 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
1dbe0 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
1dbf0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
1dc00 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
1dc10 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1dc20 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1dc30 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1dc40 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
1dc50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dc60 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1dc70 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1dc80 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1dc90 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1dca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dcb0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1dcc0 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map1", pDbFd->zP
1dcd0 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ath);.      goto
1dce0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1dcf0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
1dd00 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
1dd10 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1dd20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
1dd30 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
1dd40 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
1dd50 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
1dd60 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
1dd70 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
1dd80 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1dd90 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
1dda0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1ddb0 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
1ddc0 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
1ddd0 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
1dde0 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
1ddf0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
1de00 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
1de10 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
1de20 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
1de30 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
1de40 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
1de50 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
1de60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1de70 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1de80 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
1de90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1dea0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1deb0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1dec0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1ded0 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1dee0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1df00 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62  winShmMap2", pDb
1df10 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1df20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1df30 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1df40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
1df50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1df60 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
1df70 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1df80 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
1df90 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73  /.    apNew = (s
1dfa0 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1dfb0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1dfc0 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1dfd0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
1dfe0 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
1dff0 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
1e000 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
1e010 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e020 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1e030 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1e040 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1e050 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
1e060 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1e070 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
1e080 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1e090 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
1e0a0 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1e0b0 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
1e0c0 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
1e0d0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
1e0e0 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
1e0f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
1e100 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1e110 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
1e120 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d  S_WINRT.      hM
1e130 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1e140 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1e150 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1e160 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1e170 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1e180 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  E, nByte, NULL. 
1e190 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1e1a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1e1b0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1e1c0 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1e1d0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1e1e0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1e1f0 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1e200 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1e210 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1e220 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1e230 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1e240 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
1e250 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1e260 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1e270 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1e280 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1e290 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1e2a0 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1e2b0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
1e2c0 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1e2d0 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
1e2e0 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1e2f0 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
1e300 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1e310 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e320 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e330 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1e340 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
1e350 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
1e360 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1e370 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
1e380 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
1e390 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
1e3a0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
1e3b0 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
1e3c0 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1e3d0 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1e3e0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1e3f0 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1e400 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1e410 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
1e420 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1e430 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
1e440 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1e450 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1e460 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
1e470 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1e480 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1e490 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1e4a0 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
1e4b0 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
1e4c0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
1e4d0 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
1e4e0 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
1e4f0 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
1e500 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
1e510 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1e520 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1e530 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  t.        );.#en
1e540 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52  dif.        OSTR
1e550 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41  ACE(("SHM-MAP-MA
1e560 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1e570 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  n=%d, offset=%d,
1e580 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1e590 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e5a0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1e5b0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1e5c0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1e5d0 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
1e5e0 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
1e5f0 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
1e600 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1e610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e620 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
1e630 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
1e640 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1e650 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1e660 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1e670 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e680 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
1e690 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1e6c0 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  3", pDbFd->zPath
1e6d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68  );.        if( h
1e6e0 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e  Map ) osCloseHan
1e6f0 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20  dle(hMap);.     
1e700 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1e710 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1e720 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1e730 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
1e740 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20  nRegion].pMap = 
1e750 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMap;.      pShm
1e760 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
1e770 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
1e780 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  .hMap = hMap;.  
1e790 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
1e7a0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
1e7b0 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
1e7c0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1e7d0 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
1e7e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
1e7f0 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a  set = iRegion*sz
1e800 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  Region;.    int 
1e810 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1e820 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1e830 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1e840 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20  Granularity;.   
1e850 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
1e860 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65   *)pShmNode->aRe
1e870 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d  gion[iRegion].pM
1e880 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76  ap;.    *pp = (v
1e890 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74  oid *)&p[iOffset
1e8a0 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  Shift];.  }else{
1e8b0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
1e8c0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1e8d0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1e8e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1e8f0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  rn rc;.}..#else.
1e900 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d  # define winShmM
1e910 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
1e920 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20  e winShmLock    
1e930 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1e940 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
1e950 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20  ine winShmUnmap 
1e960 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
1e970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e980 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
1e990 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61  Cleans up the ma
1e9a0 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74  pped region of t
1e9b0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1e9c0 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69  e, if any..*/.#i
1e9d0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1e9e0 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
1e9f0 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
1ea00 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
1ea10 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
1ea20 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
1ea30 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1ea40 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1ea50 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52  , hMap=%p, pMapR
1ea60 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
1ea70 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65         "mmapSize
1ea80 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41  =%lld, mmapSizeA
1ea90 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70  ctual=%lld, mmap
1eaa0 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c  SizeMax=%lld\n",
1eab0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1eac0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ead0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1eae0 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e  e->hMap, pFile->
1eaf0 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20  pMapRegion,.    
1eb00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1eb10 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d  apSize, pFile->m
1eb20 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70  mapSizeActual, p
1eb30 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1eb40 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x));.  if( pFile
1eb50 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
1eb60 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
1eb70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
1eb80 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
1eb90 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1eba0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1ebb0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1ebc0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1ebd0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1ebe0 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
1ebf0 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1ec00 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
1ec10 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1ec20 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
1ec30 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1ec40 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
1ec50 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
1ec60 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
1ec70 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1ec80 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1ec90 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1eca0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ecc0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20  winUnmapfile1", 
1ecd0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1ece0 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1ecf0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
1ed00 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1ed10 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
1ed20 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
1ed30 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
1ed40 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
1ed50 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
1ed60 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
1ed70 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
1ed80 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1ed90 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1eda0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
1edb0 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
1edc0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1edd0 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
1ede0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1edf0 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
1ee00 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1ee10 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1ee20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
1ee30 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
1ee40 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1ee50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1ee60 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1ee70 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1ee90 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70  inUnmapfile2", p
1eea0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
1eeb0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68    }.    pFile->h
1eec0 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Map = NULL;.  }.
1eed0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1eee0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1eef0 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
1ef00 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
1ef10 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1ef20 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1ef30 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
1ef40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ef50 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
1ef60 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
1ef70 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
1ef80 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
1ef90 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
1efa0 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
1efb0 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
1efc0 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
1efd0 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
1efe0 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65   Or, if.** there
1eff0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
1f000 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
1f010 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
1f020 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20  re are still.** 
1f030 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1f040 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
1f050 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
1f060 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1f070 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1f080 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
1f090 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
1f0a0 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
1f0b0 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ted size of.** t
1f0c0 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
1f0d0 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
1f0e0 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
1f0f0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
1f100 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  n the.** request
1f110 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
1f120 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1f130 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
1f140 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
1f150 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
1f160 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
1f170 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1f180 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
1f190 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67  figured.** using
1f1a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
1f1b0 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76  AP_SIZE, whichev
1f1c0 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
1f1d0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1f1e0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
1f1f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
1f200 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
1f210 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
1f220 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
1f230 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
1f240 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
1f250 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1f260 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
1f270 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1f280 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
1f290 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  File *pFd, sqlit
1f2a0 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
1f2b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1f2c0 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
1f2d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1f2e0 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
1f2f0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
1f300 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1f310 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
1f320 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65  , pFile=%p, size
1f330 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
1f340 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f350 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1f360 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69  d, nByte));..  i
1f370 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
1f380 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
1f390 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
1f3a0 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  Map<0 ){.    rc 
1f3b0 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
1f3c0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64  qlite3_file*)pFd
1f3d0 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66  , &nMap);.    if
1f3e0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53  ( rc ){.      OS
1f3f0 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1f400 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
1f410 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1f420 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20  ERR_FSTAT\n",.  
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1f440 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1f450 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20  Id(), pFd));.   
1f460 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f470 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1f480 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d    }.  }.  if( nM
1f490 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
1f4a0 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
1f4b0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
1f4c0 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26  ax;.  }.  nMap &
1f4d0 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ~(sqlite3_int6
1f4e0 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  4)(winSysInfo.dw
1f4f0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a  PageSize - 1);..
1f500 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26    if( nMap==0 &&
1f510 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30   pFd->mmapSize>0
1f520 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   ){.    winUnmap
1f530 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20  file(pFd);.  }. 
1f540 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
1f550 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1f560 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  void *pNew = 0;.
1f570 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63      DWORD protec
1f580 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c  t = PAGE_READONL
1f590 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61  Y;.    DWORD fla
1f5a0 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45  gs = FILE_MAP_RE
1f5b0 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61  AD;..    winUnma
1f5c0 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20  pfile(pFd);.    
1f5d0 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
1f5e0 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
1f5f0 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
1f600 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45    protect = PAGE
1f610 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
1f620 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f    flags |= FILE_
1f630 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  MAP_WRITE;.    }
1f640 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1f650 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INRT.    pFd->hM
1f660 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1f670 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1f680 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
1f690 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c  otect, nMap, NUL
1f6a0 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  L);.#elif define
1f6b0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1f6c0 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64  AS_WIDE).    pFd
1f6d0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1f6e0 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46  eFileMappingW(pF
1f6f0 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1f700 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
1f730 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
1f740 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f760 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
1f770 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
1f780 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ), NULL);.#elif 
1f790 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1f7a0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
1f7b0 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
1f7c0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1f7d0 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngA(pFd->h, NULL
1f7e0 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1f810 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
1f820 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1f850 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
1f860 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
1f870 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
1f880 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29  Fd->hMap==NULL )
1f890 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  {.      pFd->las
1f8a0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1f8b0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1f8c0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1f8d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
1f8e0 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72  MAP, pFd->lastEr
1f8f0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1f900 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1f910 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e  Mapfile1", pFd->
1f920 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a  zPath);.      /*
1f930 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20   Log the error, 
1f940 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72  but continue nor
1f950 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73  mal operation us
1f960 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
1f970 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
1f980 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45  E(("MAP-FILE-CRE
1f990 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
1f9a0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f9c0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f9d0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
1f9e0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1f9f0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1fa00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1fa10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 6e  }.    assert( (n
1fa20 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  Map % winSysInfo
1fa30 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  .dwPageSize)==0 
1fa40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1fa50 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73  izeof(SIZE_T)==s
1fa60 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e  izeof(sqlite3_in
1fa70 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78  t64) || nMap<=0x
1fa80 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20  ffffffff );.#if 
1fa90 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
1faa0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
1fab0 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1fac0 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  p(pFd->hMap, fla
1fad0 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e  gs, 0, (SIZE_T)n
1fae0 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Map);.#else.    
1faf0 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
1fb00 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70  OfFile(pFd->hMap
1fb10 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28  , flags, 0, 0, (
1fb20 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
1fb30 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65  ndif.    if( pNe
1fb40 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  w==NULL ){.     
1fb50 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
1fb60 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20  Fd->hMap);.     
1fb70 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c   pFd->hMap = NUL
1fb80 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61  L;.      pFd->la
1fb90 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1fba0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1fbb0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1fbc0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1fbd0 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
1fbe0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1fc00 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d  nMapfile2", pFd-
1fc10 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
1fc20 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
1fc30 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
1fc40 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
1fc50 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
1fc60 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
1fc70 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41  CE(("MAP-FILE-MA
1fc80 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
1fc90 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
1fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1fcb0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1fcc0 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
1fcd0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1fce0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1fcf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1fd00 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
1fd10 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ion = pNew;.    
1fd20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
1fd30 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  nMap;.    pFd->m
1fd40 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
1fd50 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  nMap;.  }..  OST
1fd60 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
1fd70 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1fd80 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1fd90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1fda0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1fdb0 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
1fdc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fdd0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
1fde0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1fdf0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
1fe00 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
1fe10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1fe20 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
1fe30 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
1fe40 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
1fe50 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
1fe60 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
1fe70 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
1fe80 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
1fe90 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
1fea0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
1feb0 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
1fec0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1fed0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
1fee0 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
1fef0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
1ff00 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
1ff10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1ff20 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
1ff30 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
1ff40 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
1ff50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1ff60 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
1ff70 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
1ff80 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
1ff90 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
1ffa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
1ffb0 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
1ffc0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
1ffd0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a  must eventually.
1ffe0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
1fff0 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
20000 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29  ing winUnfetch()
20010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20020 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33  winFetch(sqlite3
20030 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
20040 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
20050 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
20060 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20070 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20  IZE>0.  winFile 
20080 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  *pFd = (winFile*
20090 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
200a0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
200b0 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
200c0 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f  .  *pp = 0;..  O
200d0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
200e0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
200f0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61  , offset=%lld, a
20100 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c  mount=%d, pp=%p\
20110 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
20120 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
20130 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66  ssId(), fd, iOff
20140 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23  , nAmt, pp));..#
20150 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
20160 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
20170 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
20180 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
20190 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
201a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
201b0 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
201c0 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
201d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
201e0 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  ){.        OSTRA
201f0 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
20200 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
20210 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
20220 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20230 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20240 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
20250 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
20260 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20280 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
20290 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
202a0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
202b0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
202c0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
202d0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
202e0 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
202f0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
20300 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
20310 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
20320 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63  p=%p, *pp=%p, rc
20330 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
20340 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
20350 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20360 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29  ), fd, pp, *pp))
20370 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20380 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
20390 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
203a0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
203b0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
203c0 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a  tion releases a.
203d0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
203e0 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
203f0 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46  ier call to winF
20400 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
20410 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
20420 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
20430 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
20440 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
20450 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
20460 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
20470 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
20480 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63  winFetch() invoc
20490 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ation..**.** Or,
204a0 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
204b0 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
204c0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
204d0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
204e0 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  ed.** to inform 
204f0 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
20500 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
20510 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
20520 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  ting mapping.** 
20530 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
20540 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
20550 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
20560 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
20570 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
20580 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
20590 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
205a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
205b0 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
205c0 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
205d0 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
205e0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
205f0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
20600 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
20610 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
20620 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
20630 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
20640 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
20650 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
20660 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
20670 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
20680 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
20690 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
206a0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
206b0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
206c0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
206d0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
206e0 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
206f0 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
20700 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
20710 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
20720 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
20730 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
20740 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
20750 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
20760 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
20770 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
20780 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
20790 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
207a0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
207b0 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
207c0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
207d0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
207e0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
207f0 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
20800 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
20810 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
20820 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
20830 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
20840 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
20850 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
20860 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
20870 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
20880 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
20890 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e 20  cessary can can 
208a0 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f 74  be omitted - pot
208b0 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76 69  entially improvi
208c0 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f 72  ng.    ** perfor
208d0 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20 77  mance.  */.    w
208e0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
208f0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
20900 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
20910 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
20920 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54 43  OSTRACE(("UNFETC
20930 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
20940 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
20950 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
20960 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
20970 63 65 73 73 49 64 28 29 2c 20 66 64 29 29 3b 0a  cessId(), fd));.
20980 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20990 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
209a0 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
209b0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
209c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
209d0 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
209e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209f0 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
20a00 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
20a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
20a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a70 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
20a80 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
20a90 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
20aa0 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
20ab0 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
20ac0 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
20ad0 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
20ae0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
20af0 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
20b00 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20 20  ethod = {.  3,  
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
20b30 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
20b40 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b60 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
20b70 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
20b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20b90 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
20ba0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
20bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
20bc0 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
20bd0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
20be0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
20bf0 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
20c00 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
20c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20c20 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
20c30 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
20c40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
20c50 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
20c60 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
20c80 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
20c90 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
20cb0 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
20cc0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
20cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
20ce0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
20cf0 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
20d00 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
20d10 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
20d20 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
20d30 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
20d40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
20d50 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
20d60 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
20d70 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
20d80 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
20d90 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
20da0 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
20db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20dc0 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
20dd0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
20de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20df0 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
20e00 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20e20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
20e30 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20 20   winShmUnmap,   
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
20e60 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20 20  .  winFetch,    
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 0a     /* xFetch */.
20e90 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20 20    winUnfetch    
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20eb0 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
20ec0 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
20ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f10 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
20f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
20f30 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
20f40 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
20f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20f60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
20f70 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
20f80 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
20f90 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
20fa0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
20fb0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23 69  s object..*/..#i
20fc0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
20fd0 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  IN__)./*.** Conv
20fe0 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20 66  ert a filename f
20ff0 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68 65  rom whatever the
21000 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72   underlying oper
21010 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a 20  ating system.** 
21020 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69 6c  supports for fil
21030 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46 2d  enames into UTF-
21040 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  8.  Space to hol
21050 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 0a  d the result is.
21060 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ** obtained from
21070 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74   malloc and must
21080 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
21090 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
210a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
210b0 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55  r *winConvertToU
210c0 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
210d0 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
210e0 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e  e){.  char *zCon
210f0 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
21100 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
21110 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
21120 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
21130 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
21140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
21150 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
21160 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  lse{.    zConver
21170 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  ted = sqlite3_wi
21180 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
21190 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
211a0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c  .#endif.  /* cal
211b0 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20  ler will handle 
211c0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
211d0 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65  .  return zConve
211e0 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rted;.}.#endif..
211f0 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
21200 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69  UTF-8 filename i
21210 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
21220 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
21230 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
21240 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e  stem wants filen
21250 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20  ames in.  Space 
21260 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
21270 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  lt.** is obtaine
21280 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
21290 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
212a0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
212b0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  * function..*/.s
212c0 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43  tatic void *winC
212d0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
212e0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
212f0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
21300 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
21310 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
21320 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
21330 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66  nverted = winUtf
21340 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
21350 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
21360 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
21370 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
21380 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
21390 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
213a0 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c  tf8_to_mbcs(zFil
213b0 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
213c0 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
213d0 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
213e0 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
213f0 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
21400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
21410 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
21420 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
21430 73 70 65 63 69 66 69 65 64 20 55 54 46 2d 38 20  specified UTF-8 
21440 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a 2a  string buffer.**
21450 20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69 72   ends with a dir
21460 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72  ectory separator
21470 20 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f 6e   character or on
21480 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
21490 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 69  ly.** added to i
214a0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
214b0 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72   winMakeEndInDir
214c0 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  Sep(int nBuf, ch
214d0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66 28  ar *zBuf){.  if(
214e0 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e 74   zBuf ){.    int
214f0 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53   nLen = sqlite3S
21500 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
21510 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29 7b     if( nLen>0 ){
21520 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
21530 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65 6e  DirSep(zBuf[nLen
21540 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
21550 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
21560 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b 31  }else if( nLen+1
21570 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  <nBuf ){.       
21580 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77 69   zBuf[nLen] = wi
21590 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20 20  nGetDirSep();.  
215a0 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 2b        zBuf[nLen+
215b0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  1] = '\0';.     
215c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
215d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
215e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
215f0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
21600 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
21610 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
21620 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65 72  esulting pointer
21630 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a 20   into pzBuf..** 
21640 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
21650 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d 75  rned in pzBuf mu
21660 73 74 20 62 65 20 66 72 65 65 64 20 76 69 61 20  st be freed via 
21670 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
21680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
21690 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c  nGetTempname(sql
216a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
216b0 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a 20  char **pzBuf){. 
216c0 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68   static char zCh
216d0 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63  ars[] =.    "abc
216e0 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
216f0 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42  tuvwxyz".    "AB
21700 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
21710 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30  STUVWXYZ".    "0
21720 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69  123456789";.  si
21730 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74  ze_t i, j;.  int
21740 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33 53   nPre = sqlite3S
21750 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
21760 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
21770 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e 42  ;.  int nMax, nB
21780 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b 0a  uf, nDir, nLen;.
21790 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20    char *zBuf;.. 
217a0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
217b0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
217c0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
217d0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
217e0 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
217f0 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
21800 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
21810 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
21820 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
21830 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
21840 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
21850 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
21860 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
21870 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
21880 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  a temporary buff
21890 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
218a0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
218b0 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 66  file.  ** name f
218c0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
218d0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73 20   file.  If this 
218e0 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f 74  fails, we cannot
218f0 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f 0a   continue..  */.
21900 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e 6d    nMax = pVfs->m
21910 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66 20  xPathname; nBuf 
21920 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a 42  = nMax + 2;.  zB
21930 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  uf = sqlite3Mall
21940 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b 0a  ocZero( nBuf );.
21950 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a 20    if( !zBuf ){. 
21960 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
21970 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21980 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21990 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
219a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
219b0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
219c0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
219d0 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61  ffective tempora
219e0 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46  ry directory.  F
219f0 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f  irst, check if o
21a00 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  ne.  ** has been
21a10 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20   explicitly set 
21a20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
21a30 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75  on; otherwise, u
21a40 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20  se the one.  ** 
21a50 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
21a60 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
21a70 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20  em..  */.  nDir 
21a80 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b  = nMax - (nPre +
21a90 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20   15);.  assert( 
21aa0 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  nDir>0 );.  if( 
21ab0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
21ac0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  ectory ){.    in
21ad0 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69  t nDirLen = sqli
21ae0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
21af0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
21b00 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  ry);.    if( nDi
21b10 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  rLen>0 ){.      
21b20 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70  if( !winIsDirSep
21b30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
21b40 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d  rectory[nDirLen-
21b50 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  1]) ){.        n
21b60 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  DirLen++;.      
21b70 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72  }.      if( nDir
21b80 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20  Len>nDir ){.    
21b90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21ba0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
21bb0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
21bc0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
21bd0 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
21be0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
21bf0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
21c00 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
21c10 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b  tTempname1", 0);
21c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
21c30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
21c40 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
21c50 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
21c60 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
21c70 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
21c80 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
21c90 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
21ca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
21cb0 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
21cc0 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51  0, /* getenv("SQ
21cd0 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f  LITE_TMPDIR") */
21ce0 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
21cf0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a  tenv("TMPDIR") *
21d00 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
21d10 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a  etenv("TMP") */.
21d20 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
21d30 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20  env("TEMP") */. 
21d40 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
21d50 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
21d60 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61  ) */.       "/va
21d70 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
21d80 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
21d90 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20    "/tmp",.      
21da0 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20   ".",.       0  
21db0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
21dc0 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20  rminator */.    
21dd0 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  };.    unsigned 
21de0 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
21df0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
21e00 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ..    if( !azDir
21e10 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d  s[0] ) azDirs[0]
21e20 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
21e30 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  E_TMPDIR");.    
21e40 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
21e50 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
21e60 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
21e70 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32     if( !azDirs[2
21e80 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20  ] ) azDirs[2] = 
21e90 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20  getenv("TMP");. 
21ea0 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33     if( !azDirs[3
21eb0 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20  ] ) azDirs[3] = 
21ec0 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a  getenv("TEMP");.
21ed0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21ee0 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d  4] ) azDirs[4] =
21ef0 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
21f00 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28  FILE");.    for(
21f10 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
21f20 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
21f30 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
21f40 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
21f50 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
21f60 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44  ed;.      if( zD
21f70 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
21f80 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
21f90 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69  e path starts wi
21fa0 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
21fb0 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  r followed by th
21fc0 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a  e colon.      **
21fd0 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75   character, assu
21fe0 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  me it is already
21ff0 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
22000 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c  path; otherwise,
22010 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73  .      ** it mus
22020 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74  t be converted t
22030 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  o a native Win32
22040 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79   path via the Cy
22050 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a  gwin API.      *
22060 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67  * prior to using
22070 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
22080 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69      if( winIsDri
22090 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
220a0 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
220b0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
220c0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
220d0 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b  8Filename(zDir);
220e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
220f0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
22100 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22110 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22120 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22130 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22140 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22150 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
22160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22170 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
22180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22190 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
221a0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
221b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
221c0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
221d0 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20  , "%s", zDir);. 
221e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
221f0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
22210 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
22220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22230 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
22240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22250 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
22260 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
22270 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20  ero( nMax+1 );. 
22280 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
22290 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
222a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
222b0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
222c0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
222d0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
222e0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
222f0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
22300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22310 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
22320 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
22330 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
22340 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h(.             
22350 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43     osIsNT() ? CC
22360 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
22370 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
22380 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20  WIN_A, zDir,.   
22390 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
223a0 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29  nverted, nMax+1)
223b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
223c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
223d0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
223e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
223f0 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
22400 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22410 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22420 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
22430 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  TH\n"));.       
22440 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
22450 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
22460 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  RR_CONVPATH, (DW
22470 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
224a0 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29  empname2", zDir)
224b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
224c0 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
224d0 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
224e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
224f0 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
22500 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61 74  now the candidat
22510 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73  e directory exis
22520 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  ts and should.  
22530 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73          ** be us
22540 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65  ed.  However, we
22550 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e   may need to con
22560 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  vert the string 
22570 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20  containing.     
22580 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65       ** its name
22590 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65   into UTF-8 (i.e
225a0 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d 31  . if it is UTF-1
225b0 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20  6 right now)..  
225c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
225d0 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
225e0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
225f0 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e  tf8Filename(zCon
22600 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
22610 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
22620 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
22630 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
22640 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
22650 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22660 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
22670 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22680 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22690 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
226a0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
226b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
226c0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
226d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
226e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
226f0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
22700 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
22710 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22720 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
22730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22740 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
22750 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22760 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
22770 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22780 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
22790 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
227a0 0a 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f  .#elif !SQLITE_O
227b0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
227c0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
227d0 20 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e    else if( osIsN
227e0 54 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  T() ){.    char 
227f0 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57  *zMulti;.    LPW
22800 53 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20  STR zWidePath = 
22810 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
22820 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57  o( nMax*sizeof(W
22830 43 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28  CHAR) );.    if(
22840 20 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20   !zWidePath ){. 
22850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22860 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22870 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22880 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22890 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
228a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
228b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
228c0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
228d0 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  ( osGetTempPathW
228e0 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68  (nMax, zWidePath
228f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
22900 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
22910 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  Path);.      sql
22920 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22930 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22940 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22950 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
22960 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
22970 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
22980 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22990 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
229a0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
229b0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
229d0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22  winGetTempname2"
229e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
229f0 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63  zMulti = winUnic
22a00 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50  odeToUtf8(zWideP
22a10 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d  ath);.    if( zM
22a20 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71  ulti ){.      sq
22a30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
22a40 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
22a50 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
22a60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75  sqlite3_free(zMu
22a70 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
22a80 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
22a90 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  th);.    }else{.
22aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22ab0 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
22ac0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22ad0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22ae0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22af0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22b00 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22b10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22b20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22b30 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  EM;.    }.  }.#i
22b40 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
22b50 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
22b60 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74  e{.    char *zUt
22b70 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  f8;.    char *zM
22b80 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65  bcsPath = sqlite
22b90 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
22ba0 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  x );.    if( !zM
22bb0 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20  bcsPath ){.     
22bc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22bd0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
22be0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22bf0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22c00 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
22c10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
22c20 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
22c30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
22c40 47 65 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61  GetTempPathA(nMa
22c50 78 2c 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30  x, zMbcsPath)==0
22c60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22c70 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22c80 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22c90 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22ca0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
22cb0 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  EMPPATH\n"));.  
22cc0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22cd0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
22ce0 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c  ERR_GETTEMPPATH,
22cf0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
22d00 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
22d10 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
22d20 47 65 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30  GetTempname3", 0
22d30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  );.    }.    zUt
22d40 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  f8 = sqlite3_win
22d50 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
22d60 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
22d70 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20  if( zUtf8 ){.   
22d80 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22d90 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
22da0 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
22db0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22dc0 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c  (zUtf8);.    }el
22dd0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
22de0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22df0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
22e00 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22e10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22e20 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
22e30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22e40 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
22e50 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
22e60 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
22e70 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  SI */.#endif /* 
22e80 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
22e90 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43   */..  /*.  ** C
22ea0 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
22eb0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
22ec0 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20 77  directory ends w
22ed0 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ith an appropria
22ee0 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74 6f  te.  ** separato
22ef0 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  r.  If it does n
22f00 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  ot and there is 
22f10 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63 65  not enough space
22f20 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20 2a   left to add.  *
22f30 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20 2a  * one, fail..  *
22f40 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b 65  /.  if( !winMake
22f50 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69 72  EndInDirSep(nDir
22f60 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20 20  +1, zBuf) ){.   
22f70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
22f80 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  uf);.    OSTRACE
22f90 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22fa0 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
22fb0 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
22fc0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
22fd0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
22fe0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34 22  winGetTempname4"
22ff0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  , 0);.  }..  /*.
23000 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20    ** Check that 
23010 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
23020 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  r is large enoug
23030 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  h for the tempor
23040 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61  ary file.  ** na
23050 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  me in the follow
23060 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a 2a  ing format:.  **
23070 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f 72  .  **   "<tempor
23080 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f 65  ary_directory>/e
23090 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58 58  tilqs_XXXXXXXXXX
230a0 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a 0a  XXXXX\0\0".  **.
230b0 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65 74    ** If not, ret
230c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
230d0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31 37  .  The number 17
230e0 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69 6e   is used here in
230f0 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20 61   order to.  ** a
23100 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 73  ccount for the s
23110 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
23120 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72 61   15 character ra
23130 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64 20  ndom suffix and 
23140 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72 61  the.  ** two tra
23150 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61 63  iling NUL charac
23160 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61 6c  ters.  The final
23170 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72   directory separ
23180 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 20  ator character. 
23190 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
231a0 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73 20  added if it was 
231b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65 73  not already pres
231c0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65 6e  ent..  */.  nLen
231d0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
231e0 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28 20  30(zBuf);.  if( 
231f0 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20 31  (nLen + nPre + 1
23200 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20 20  7) > nBuf ){.   
23210 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
23220 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  uf);.    OSTRACE
23230 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
23240 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
23250 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75 72  \n"));.    retur
23260 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
23270 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22  LITE_ERROR, 0, "
23280 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35 22  winGetTempname5"
23290 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  , 0);.  }..  sql
232a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
232b0 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75 66  uf-16-nLen, zBuf
232c0 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54 45  +nLen, SQLITE_TE
232d0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 3b  MP_FILE_PREFIX);
232e0 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53  ..  j = sqlite3S
232f0 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20  trlen30(zBuf);. 
23300 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
23310 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
23320 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
23330 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
23340 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
23350 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
23360 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
23370 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
23380 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20  rs)-1) ];.  }.  
23390 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a  zBuf[j] = 0;.  z
233a0 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
233b0 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a 0a  *pzBuf = zBuf;..
233c0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
233d0 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d 25  -FILENAME name=%
233e0 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  s, rc=SQLITE_OK\
233f0 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65  n", zBuf));.  re
23400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23410 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23420 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65  TRUE if the name
23430 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79  d file is really
23440 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52   a directory.  R
23450 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a  eturn false if.*
23460 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e  * it is somethin
23470 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64  g other than a d
23480 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20  irectory, or if 
23490 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
234a0 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61  d of memory.** a
234b0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
234c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
234d0 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20   winIsDir(const 
234e0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
234f0 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
23500 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
23510 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
23520 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
23530 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
23540 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
23550 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
23560 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
23570 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
23580 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
23590 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
235a0 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
235b0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
235c0 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
235d0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235f0 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
23600 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
23630 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52  trData)) && winR
23640 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
23650 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
23660 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
23670 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
23680 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20  * Invalid name? 
23690 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74  */.    }.    att
236a0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
236b0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
236c0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
236d0 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
236e0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
236f0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
23700 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
23710 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
23720 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49   return (attr!=I
23730 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
23740 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72  IBUTES) && (attr
23750 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
23760 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f  DIRECTORY);.}../
23770 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
23780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23790 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
237a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
237b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
237c0 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68  get maximum path
237d0 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20 2a 2f 0a   name length */.
237e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
237f0 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame,        /* N
23800 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
23810 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
23820 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
23830 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
23840 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
23850 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
23860 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
23870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
23880 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  en mode flags */
23890 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
238a0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
238b0 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c  Status return fl
238c0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44  ags */.){.  HAND
238d0 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61  LE h;.  DWORD la
238e0 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44  stErrno = 0;.  D
238f0 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
23900 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77  cess;.  DWORD dw
23910 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f  ShareMode;.  DWO
23920 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73  RD dwCreationDis
23930 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52  position;.  DWOR
23940 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  D dwFlagsAndAttr
23950 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20  ibutes = 0;.#if 
23960 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
23970 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30    int isTemp = 0
23980 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  ;.#endif.  winFi
23990 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
239a0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
239b0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
239c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
239d0 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
239e0 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
239f0 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
23a00 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c   = zName; /* Fil
23a10 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
23a20 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
23a30 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20   cnt = 0;..  /* 
23a40 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
23a50 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
23a60 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
23a70 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
23a80 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
23a90 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
23aa0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
23ab0 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
23ac0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
23ad0 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d  char *zTmpname =
23ae0 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f   0; /* For tempo
23af0 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69  rary filename, i
23b00 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a  f necessary. */.
23b10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23b20 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
23b30 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65    /* Function Re
23b40 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66  turn Code */.#if
23b50 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
23b60 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) || SQLITE_OS_W
23b70 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65  INCE.  int eType
23b80 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46   = flags&0xFFFFF
23b90 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66  F00;  /* Type of
23ba0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
23bb0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69  .#endif..  int i
23bc0 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
23bd0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23be0 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
23bf0 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
23c00 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
23c10 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
23c20 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
23c30 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
23c40 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23c50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
23c60 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
23c70 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
23c80 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
23c90 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
23ca0 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
23cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23cc0 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20  RITE);..#ifndef 
23cd0 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f  NDEBUG.  int isO
23ce0 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73  penJournal = (is
23cf0 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
23d00 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
23d10 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
23d20 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54  URNAL.     || eT
23d30 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
23d40 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20  _MAIN_JOURNAL.  
23d50 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
23d60 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
23d70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54  );.#endif..  OST
23d80 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
23d90 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  =%s, pFile=%p, f
23da0 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61  lags=%x, pOutFla
23db0 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  gs=%p\n",.      
23dc0 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20       zUtf8Name, 
23dd0 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46  id, flags, pOutF
23de0 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68  lags));..  /* Ch
23df0 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
23e00 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
23e10 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   true:.  **.  **
23e20 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
23e30 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
23e40 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
23e50 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
23e60 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
23e70 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
23e80 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
23e90 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
23ea0 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
23eb0 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
23ec0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
23ed0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
23ee0 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
23ef0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
23f00 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
23f10 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
23f20 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
23f30 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
23f40 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
23f50 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
23f60 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
23f70 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
23f80 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
23f90 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
23fa0 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
23fb0 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
23fc0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
23fd0 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
23fe0 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
23ff0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
24000 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
24010 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
24020 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
24030 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
24040 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
24050 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
24060 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
24070 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
24080 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
24090 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
240a0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
240b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
240c0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
240d0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
240e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
240f0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
24100 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
24110 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
24120 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
24130 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
24140 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
24150 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
24160 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
24170 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
24180 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
24190 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
241a0 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
241b0 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
241c0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
241d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
241e0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
241f0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24200 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20  E_OPEN_TEMP_DB. 
24210 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
24220 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
24230 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
24240 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
24250 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  EMP_JOURNAL.    
24260 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
24270 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
24280 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  NAL   || eType==
24290 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
242a0 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  ER_JOURNAL.     
242b0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
242c0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
242d0 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
242e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
242f0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
24300 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d  File!=0 );.  mem
24310 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
24320 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a  zeof(winFile));.
24330 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
24340 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
24350 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  E;..#if SQLITE_O
24360 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a  S_WINRT.  if( !z
24370 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c  Utf8Name && !sql
24380 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
24390 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
243a0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
243b0 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71  ROR,.        "sq
243c0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
243d0 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73 68  tory variable sh
243e0 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20  ould be set for 
243f0 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e  WinRT");.  }.#en
24400 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
24410 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
24420 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
24430 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72  n is NULL, gener
24440 61 74 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f  ate a.  ** tempo
24450 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74  rary file name t
24460 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  o use.  */.  if(
24470 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20   !zUtf8Name ){. 
24480 20 20 20 61 73 73 65 72 74 28 20 69 73 44 65 6c     assert( isDel
24490 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f  ete && !isOpenJo
244a0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20  urnal );.    rc 
244b0 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  = winGetTempname
244c0 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65  (pVfs, &zTmpname
244d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
244e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
244f0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
24500 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22   name=%s, rc=%s"
24510 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c  , zUtf8Name, sql
24520 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
24530 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24540 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
24550 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
24560 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
24570 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
24580 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
24590 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
245a0 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
245b0 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
245c0 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
245d0 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
245e0 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
245f0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
24600 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
24610 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
24620 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
24630 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
24640 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
24650 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a  URI) ||.       z
24660 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33  Utf8Name[sqlite3
24670 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61  Strlen30(zUtf8Na
24680 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
24690 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66  /* Convert the f
246a0 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73  ilename to the s
246b0 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20  ystem encoding. 
246c0 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  */.  zConverted 
246d0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
246e0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
246f0 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
24700 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
24710 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24720 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20  (zTmpname);.    
24730 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
24740 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
24750 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20  E_IOERR_NOMEM", 
24760 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
24770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
24780 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
24790 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28  .  if( winIsDir(
247a0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
247b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
247c0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
247d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
247e0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
247f0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
24800 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43  =%s, rc=SQLITE_C
24810 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20  ANTOPEN_ISDIR", 
24820 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
24830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24840 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20  ANTOPEN_ISDIR;. 
24850 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
24860 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
24870 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
24880 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
24890 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
248a0 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
248b0 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
248c0 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
248d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
248e0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
248f0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
24900 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
24910 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20  s.  ** created. 
24920 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75  SQLite doesn't u
24930 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74  se it to indicat
24940 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63  e "exclusive acc
24950 65 73 73 22 0a 20 20 2a 2a 20 61 73 20 69 74 20  ess".  ** as it 
24960 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72  is usually under
24970 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stood..  */.  if
24980 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ( isExclusive ){
24990 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20  .    /* Creates 
249a0 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79  a new file, only
249b0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
249c0 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a  already exist. *
249d0 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  /.    /* If the 
249e0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20  file exists, it 
249f0 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77  fails. */.    dw
24a00 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24a10 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57  ion = CREATE_NEW
24a20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
24a30 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
24a40 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
24a50 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
24a60 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
24a70 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  st */.    dwCrea
24a80 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
24a90 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20  = OPEN_ALWAYS;. 
24aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
24ab0 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c  pens a file, onl
24ac0 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  y if it exists. 
24ad0 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
24ae0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
24af0 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
24b00 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65  }..  dwShareMode
24b10 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
24b20 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
24b30 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73  WRITE;..  if( is
24b40 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51  Delete ){.#if SQ
24b50 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
24b60 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
24b70 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
24b80 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
24b90 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
24ba0 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
24bb0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
24bc0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
24bd0 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bf0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
24c00 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
24c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
24c40 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
24c50 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
24c60 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
24c70 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
24c80 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
24c90 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
24ca0 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
24cb0 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
24cc0 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
24cd0 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
24ce0 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
24cf0 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
24d00 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
24d10 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
24d20 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
24d30 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
24d40 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
24d50 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
24d60 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
24d70 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
24d80 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41  S_WINRT.    CREA
24d90 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
24da0 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65  _PARAMETERS exte
24db0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a  ndedParameters;.
24dc0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
24dd0 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20  meters.dwSize = 
24de0 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c  sizeof(CREATEFIL
24df0 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
24e00 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74  METERS);.    ext
24e10 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24e20 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
24e30 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   =.            d
24e40 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24e50 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49  tes & FILE_ATTRI
24e60 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  BUTE_MASK;.    e
24e70 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24e80 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20  s.dwFileFlags = 
24e90 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24ea0 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47  utes & FILE_FLAG
24eb0 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
24ec0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
24ed0 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73  SecurityQosFlags
24ee0 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e   = SECURITY_ANON
24ef0 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e  YMOUS;.    exten
24f00 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70  dedParameters.lp
24f10 53 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74  SecurityAttribut
24f20 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65  es = NULL;.    e
24f30 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24f40 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20  s.hTemplateFile 
24f50 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c  = NULL;.    whil
24f60 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
24f70 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a  File2((LPCWSTR)z
24f80 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
24fb0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
24fe0 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
25010 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 20 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65          &extende
25040 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49  dParameters))==I
25050 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
25060 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
25090 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
250a0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
250b0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
250c0 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  /.    }.#else.  
250d0 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
250e0 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43  CreateFileW((LPC
250f0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
25100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
25120 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
25150 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
25160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
25180 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
25190 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
251c0 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d          NULL))==
251f0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
25200 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25220 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f        winRetryIo
25230 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
25240 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
25250 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
25260 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
25270 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
25280 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
25290 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69  .  else{.    whi
252a0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
252b0 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
252c0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
252f0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25310 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
25320 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
25350 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
25380 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
25390 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
253c0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
253d0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253f0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
25400 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
25410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25420 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
25430 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
25440 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29  winLogIoerr(cnt)
25450 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
25460 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d  PEN file=%p, nam
25470 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78  e=%s, access=%lx
25480 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a  , rc=%s\n", h, z
25490 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20  Utf8Name,.      
254a0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
254b0 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49  cess, (h==INVALI
254c0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20  D_HANDLE_VALUE) 
254d0 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
254e0 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49  "));..  if( h==I
254f0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
25500 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LUE ){.    pFile
25510 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
25520 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
25530 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25540 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d  CANTOPEN, pFile-
25550 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e  >lastErrno, "win
25560 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65  Open", zUtf8Name
25570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
25580 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
25590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
255a0 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
255b0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
255c0 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
255d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
255e0 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
255f0 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20  Name, id,.      
25600 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
25610 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
25620 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   &.             
25630 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45          ~(SQLITE
25640 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
25650 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
25660 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70  TE)),.         p
25670 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
25680 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
25690 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
256a0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
256b0 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   }..  if( pOutFl
256c0 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ags ){.    if( i
256d0 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
256e0 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
256f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
25700 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  DWRITE;.    }els
25710 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  e{.      *pOutFl
25720 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
25730 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
25740 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  }.  }..  OSTRACE
25750 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
25760 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
25770 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  =%lx, pOutFlags=
25780 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25  %p, *pOutFlags=%
25790 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
257a0 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55  "rc=%s\n", h, zU
257b0 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  tf8Name, dwDesir
257c0 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c  edAccess, pOutFl
257d0 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f  ags, pOutFlags ?
257e0 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75  .           *pOu
257f0 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d  tFlags : 0, (h==
25800 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
25810 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
25820 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20   : "ok"));..#if 
25830 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
25840 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
25850 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
25860 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
25870 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
25880 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
25890 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d  zName, pFile))!=
258a0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20  SQLITE_OK.  ){. 
258b0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
258c0 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (h);.    sqlite3
258d0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
258e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
258f0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
25900 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
25910 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25  N-CE-LOCK name=%
25920 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61  s, rc=%s\n", zNa
25930 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
25940 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65  me(rc)));.    re
25950 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
25960 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
25970 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
25980 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
25990 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
259a0 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
259b0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
259c0 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ted);.  }..  sql
259d0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
259e0 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  me);.  pFile->pM
259f0 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65  ethod = &winIoMe
25a00 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  thod;.  pFile->p
25a10 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46  Vfs = pVfs;.  pF
25a20 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66  ile->h = h;.  if
25a30 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ( isReadonly ){.
25a40 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
25a50 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
25a60 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  RDONLY;.  }.  if
25a70 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
25a80 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73  olean(zName, "ps
25a90 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
25aa0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
25ab0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
25ac0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
25ad0 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
25ae0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
25af0 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70   = NO_ERROR;.  p
25b00 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e  File->zPath = zN
25b10 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ame;.#if SQLITE_
25b20 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
25b30 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20    pFile->hMap = 
25b40 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  NULL;.  pFile->p
25b50 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
25b60 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
25b70 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
25b80 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
25b90 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
25ba0 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
25bb0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
25bc0 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Mmap;.#endif..  
25bd0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
25be0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25bf0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
25c00 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
25c10 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69  .** Note that Wi
25c20 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
25c30 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
25c40 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
25c50 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
25c60 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
25c70 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
25c80 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
25c90 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
25ca0 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
25cb0 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
25cc0 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
25cd0 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
25ce0 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
25cf0 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
25d00 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
25d10 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
25d20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
25d30 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
25d40 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
25d50 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
25d60 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
25d70 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
25d80 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
25d90 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
25da0 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
25db0 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
25dc0 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
25dd0 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
25de0 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
25df0 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
25e00 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
25e10 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
25e20 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
25e30 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
25e40 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
25e50 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
25e60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
25e70 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
25e80 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
25e90 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  e */.  int syncD
25ea0 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ir              
25eb0 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
25ec0 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20  n win32 */.){.  
25ed0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
25ee0 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61  nt rc;.  DWORD a
25ef0 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ttr;.  DWORD las
25f00 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
25f10 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
25f20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
25f30 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53  ER(pVfs);.  UNUS
25f40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e  ED_PARAMETER(syn
25f50 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  cDir);..  Simula
25f60 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
25f70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
25f80 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  LETE);.  OSTRACE
25f90 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
25fa0 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22  s, syncDir=%d\n"
25fb0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e  , zFilename, syn
25fc0 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76  cDir));..  zConv
25fd0 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
25fe0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
25ff0 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
26000 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
26010 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
26020 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
26030 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
26040 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
26050 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
26060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
26070 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
26080 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
26090 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
260a0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
260b0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
260c0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
260d0 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
260e0 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
260f0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
26100 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
26110 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
26120 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
26130 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
26140 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
26170 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
26180 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
26190 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
261a0 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
261b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
261c0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
261d0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
261e0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
261f0 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
26200 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
26210 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
26220 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
26230 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
26240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
26250 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
26260 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
26270 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
26280 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
26290 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
262a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
262b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
262c0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
262d0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
262e0 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
262f0 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
26300 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
26310 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
26320 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
26330 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
26340 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
26350 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
26360 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
26370 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
26380 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
26390 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
263a0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
263b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
263c0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
263d0 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
263e0 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
263f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26400 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26410 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
26420 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26430 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
26440 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
26450 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
26460 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
26470 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
26480 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
26490 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
264a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
264b0 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
264c0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
264d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
264e0 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
264f0 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
26500 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26510 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
26520 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
26530 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
26540 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26550 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
26560 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
26570 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26580 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
26590 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65  le(1);.  }.#ifde
265a0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
265b0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
265c0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61      do {.      a
265d0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
265e0 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76  ttributesA(zConv
265f0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66  erted);.      if
26600 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
26610 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
26620 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
26630 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
26640 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
26650 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
26660 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
26670 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
26680 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
26690 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
266a0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
266b0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
266c0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
266d0 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
266e0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
266f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26700 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
26710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26720 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26730 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
26740 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
26750 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
26760 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26770 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
26780 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
26790 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
267a0 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
267b0 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
267c0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
267d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
267e0 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
267f0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
26800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26810 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
26820 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
26830 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
26840 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26850 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
26860 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
26870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26880 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
26890 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
268a0 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49  ( rc && rc!=SQLI
268b0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
268c0 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  NOENT ){.    rc 
268d0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
268e0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
268f0 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  E, lastErrno, "w
26900 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
26910 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
26920 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
26930 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  cnt);.  }.  sqli
26940 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
26950 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
26960 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
26970 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c  , rc=%s\n", zFil
26980 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72  ename, sqlite3Er
26990 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
269a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
269b0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
269c0 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stence and statu
269d0 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
269e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
269f0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
26a00 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
26a10 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
26a20 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
26a30 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
26a40 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
26a50 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
26a60 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
26a90 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
26aa0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
26ab0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
26ac0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
26ad0 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
26ae0 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
26af0 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
26b00 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
26b10 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
26b20 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
26b30 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53  ETER(pVfs);..  S
26b40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
26b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
26b60 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
26b70 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
26b80 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73  S name=%s, flags
26b90 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c  =%x, pResOut=%p\
26ba0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a  n",.           z
26bb0 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c  Filename, flags,
26bc0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a   pResOut));..  z
26bd0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
26be0 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
26bf0 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
26c00 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
26c10 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
26c20 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
26c30 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
26c40 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
26c50 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
26c60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26c70 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
26c80 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
26c90 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
26ca0 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
26cb0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
26cc0 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
26cd0 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
26ce0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
26cf0 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
26d00 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
26d10 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
26d20 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
26d30 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
26d60 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d80 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
26d90 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52 65  rData)) && winRe
26da0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
26db0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
26dc0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
26dd0 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
26de0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
26df0 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
26e00 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
26e10 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
26e20 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
26e30 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
26e40 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
26e50 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
26e60 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
26e70 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
26e80 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20  leSizeHigh==0.  
26e90 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
26ea0 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
26eb0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
26ec0 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
26ed0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
26ee0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26ef0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
26f00 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
26f10 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
26f20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26f30 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74   winLogIoerr(cnt
26f40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
26f50 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
26f60 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
26f70 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
26f80 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
26f90 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26fa0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
26fb0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
26fc0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
26fd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
26fe0 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
26ff0 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20  "winAccess",.   
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
27020 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
27030 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
27040 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
27050 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
27060 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
27070 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
27080 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
27090 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
270a0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
270b0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
270c0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
270d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
270e0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
270f0 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
27100 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
27110 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
27120 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
27130 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
27140 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
27150 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
27160 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
27170 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
27180 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
27190 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
271a0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
271b0 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
271c0 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
271d0 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
271e0 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
271f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
27200 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
27210 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
27220 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
27230 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
27240 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
27250 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
27260 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%s, pResOut=%p,
27270 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
27280 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
27290 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
272a0 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ame, pResOut, *p
272b0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
272c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
272d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
272e0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
272f0 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
27300 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
27310 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a   drive letter.**
27320 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
27330 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a  olon character..
27340 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
27350 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
27360 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74  ndColon(.  const
27370 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
27380 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73  .){.  return ( s
27390 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
273a0 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
273b0 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
273c0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
273d0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
273e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
273f0 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
27400 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d  be used verbatim
27410 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  .  If.** non-zer
27420 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72  o is returned fr
27430 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
27440 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
27450 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70  nction must simp
27460 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72  ly.** use the pr
27470 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65  ovided path name
27480 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72   verbatim -OR- r
27490 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61  esolve it into a
274a0 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a   full path name.
274b0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74  ** using the Get
274c0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e  FullPathName Win
274d0 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  32 API function 
274e0 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
274f0 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
27500 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
27510 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
27520 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
27530 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
27540 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
27550 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72  ts with a forwar
27560 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63  d slash or a bac
27570 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69  kslash, it is ei
27580 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61  ther.  ** a lega
27590 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f  l UNC name, a vo
275a0 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61  lume relative pa
275b0 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  th, or an absolu
275c0 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20  te path name in 
275d0 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20  the.  ** "Unix" 
275e0 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77  format on Window
275f0 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  s.  There is no 
27600 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66  easy way to diff
27610 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
27620 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  n.  ** the final
27630 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72   two cases; ther
27640 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e  efore, we return
27650 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72   the safer retur
27660 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a  n value of TRUE.
27670 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c    ** so that cal
27680 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
27690 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c  ction will simpl
276a0 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  y use it verbati
276b0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  m..  */.  if ( w
276c0 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68  inIsDirSep(zPath
276d0 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
276e0 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
276f0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
27700 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
27710 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65  rts with a lette
27720 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74  r and a colon it
27730 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c   is either a vol
27740 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ume.  ** relativ
27750 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73  e path or an abs
27760 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c  olute path.  Cal
27770 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
27780 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20  ction must not. 
27790 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74   ** attempt to t
277a0 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c  reat it as a rel
277b0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
277c0 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c  (i.e. they shoul
277d0 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a  d simply use.  *
277e0 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a  * it verbatim)..
277f0 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
27800 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
27810 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20  olon(zPathname) 
27820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
27830 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
27840 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
27850 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
27860 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
27870 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
27880 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
27890 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
278a0 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
278b0 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
278c0 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
278d0 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
278e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
278f0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
27900 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
27910 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
27920 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
27930 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
27940 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
27950 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
27960 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
27970 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
27980 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
27990 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
279a0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
279b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
279c0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
279d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
279e0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
279f0 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
27a00 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
27a10 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
27a20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
27a30 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
27a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27a50 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
27a60 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
27a70 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
27a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a90 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
27aa0 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69 66 20 64  fer */.){..#if d
27ab0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
27ac0 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  _).  SimulateIOE
27ad0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
27ae0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55  ITE_ERROR );.  U
27af0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27b00 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74  nFull);.  assert
27b10 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d  ( nFull>=pVfs->m
27b20 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69  xPathname );.  i
27b30 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
27b40 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
27b50 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
27b60 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
27b70 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
27b80 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
27b90 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
27ba0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
27bb0 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
27bc0 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
27bd0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
27be0 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
27bf0 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
27c00 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
27c10 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
27c20 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
27c30 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
27c40 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
27c50 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
27c60 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
27c70 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73  ctory and a slas
27c80 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  h..    */.    ch
27c90 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
27ca0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
27cb0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
27cc0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
27cd0 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
27ce0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
27cf0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
27d00 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
27d10 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
27d20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43    (osIsNT() ? CC
27d30 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
27d40 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
27d50 57 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20  WIN_A) |.       
27d60 20 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56       CCP_RELATIV
27d70 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f  E, zRelative, zO
27d80 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ut, pVfs->mxPath
27d90 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20  name+1)<0 ){.   
27da0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27db0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74  zOut);.      ret
27dc0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
27dd0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
27de0 43 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44  CONVPATH, (DWORD
27df0 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  )errno,.        
27e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e10 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
27e20 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
27e30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27e40 20 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20    char *zUtf8 = 
27e50 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38  winConvertToUtf8
27e60 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a  Filename(zOut);.
27e70 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38        if( !zUtf8
27e80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
27e90 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
27ea0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
27eb0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27ec0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
27ed0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
27ee0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
27ef0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
27f00 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
27f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27f20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27f30 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
27f40 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
27f50 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
27f60 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
27f70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27f80 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
27f90 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
27fa0 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
27fb0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
27fc0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
27fd0 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
27fe0 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
27ff0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28000 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
28010 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
28020 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
28030 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20 3f 20      (osIsNT() ? 
28040 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
28050 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
28060 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20 20 20  O_WIN_A),.      
28070 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2c        zRelative,
28080 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78 50   zOut, pVfs->mxP
28090 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b 0a  athname+1)<0 ){.
280a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
280b0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
280c0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
280d0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
280e0 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  EN_CONVPATH, (DW
280f0 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28120 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76  name2", zRelativ
28130 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
28140 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
28150 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
28160 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75 74  tf8Filename(zOut
28170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 55  );.      if( !zU
28180 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tf8 ){.        s
28190 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
281a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
281b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
281c0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
281d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
281e0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
281f0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28200 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
28210 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
28220 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
28230 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28240 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
28250 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
28270 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f  f..#if (SQLITE_O
28280 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
28290 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21  E_OS_WINRT) && !
282a0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
282b0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
282c0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
282d0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
282e0 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
282f0 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
28300 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
28310 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
28320 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68   */.  /* WinRT h
28330 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e  as no way to con
28340 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20  vert a relative 
28350 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c  path to an absol
28360 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66  ute one. */.  if
28370 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
28380 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
28390 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
283a0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
283b0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
283c0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
283d0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
283e0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
283f0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
28400 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
28410 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
28420 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
28430 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
28440 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
28450 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
28460 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
28470 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
28480 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
28490 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
284a0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
284b0 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
284c0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
284d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
284e0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
284f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
28500 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
28510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28520 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
28530 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
28540 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52  nGetDirSep(), zR
28550 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73  elative);.  }els
28560 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
28570 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
28580 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
28590 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
285a0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
285b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
285c0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
285d0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
285e0 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
285f0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
28600 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
28610 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20    DWORD nByte;. 
28620 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
28630 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
28640 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
28650 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ath name begins 
28660 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72  with "/X:", wher
28670 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70  e "X" is any alp
28680 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61  habetic.  ** cha
28690 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20  racter, discard 
286a0 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20  the initial "/" 
286b0 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d  from the pathnam
286c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  e..  */.  if( zR
286d0 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
286e0 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  && winIsDriveLet
286f0 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c  terAndColon(zRel
28700 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20  ative+1) ){.    
28710 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d  zRelative++;.  }
28720 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
28730 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
28740 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
28750 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
28760 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
28770 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
28780 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
28790 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
287a0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
287b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
287c0 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ing. This functi
287d0 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66  on could fail if
287e0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74  , for example, t
287f0 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
28800 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
28810 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e  y has been unlin
28820 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ked..  */.  Simu
28830 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
28840 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
28850 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74   );.  if ( sqlit
28860 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
28870 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
28880 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
28890 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
288a0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
288b0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
288c0 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
288d0 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
288e0 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
288f0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
28900 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
28910 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
28920 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
28930 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
28940 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
28950 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
28960 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
28970 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
28980 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
28990 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
289a0 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20   a backslash..  
289b0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
289c0 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
289d0 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
289e0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
289f0 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%c%s",.       
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
28a10 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
28a20 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53  tory, winGetDirS
28a30 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29  ep(), zRelative)
28a40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28a50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43  ITE_OK;.  }.  zC
28a60 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
28a70 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
28a80 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
28a90 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
28aa0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
28ab0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28ac0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
28ad0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
28ae0 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a    LPWSTR zTemp;.
28af0 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
28b00 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
28b10 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
28b20 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ed, 0, 0, 0);.  
28b30 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
28b40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28b50 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
28b60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
28b70 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
28b80 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
28b90 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
28ba0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
28bd0 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
28be0 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
28bf0 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20  += 3;.    zTemp 
28c00 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
28c10 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
28c20 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
28c30 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
28c40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28c50 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28c60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28c70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28c80 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  EM;.    }.    nB
28c90 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
28ca0 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
28cb0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  R)zConverted, nB
28cc0 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
28cd0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
28ce0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28cf0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
28d00 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
28d10 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
28d20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
28d30 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
28d40 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
28d50 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
28d60 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
28d80 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c  nFullPathname2",
28d90 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
28da0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
28db0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
28dc0 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55  .    zOut = winU
28dd0 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
28de0 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
28df0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
28e00 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
28e10 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
28e20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
28e30 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
28e40 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
28e50 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
28e60 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
28e70 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
28e80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
28e90 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28ea0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
28eb0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
28ec0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
28ed0 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
28ee0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
28ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f00 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
28f10 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74  thname3", zRelat
28f20 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
28f30 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20  nByte += 3;.    
28f40 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d  zTemp = sqlite3M
28f50 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
28f60 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
28f70 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
28f80 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
28f90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28fa0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
28fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
28fc0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
28fd0 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
28fe0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
28ff0 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
29000 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
29010 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
29020 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
29030 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
29040 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
29050 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
29060 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29070 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
29080 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
29090 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
290a0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
290d0 65 34 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e4", zRelative);
290e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
290f0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
29100 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
29110 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
29120 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
29130 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
29140 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
29150 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75  #endif.  if( zOu
29160 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
29170 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
29180 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
29190 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
291a0 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
291b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
291c0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
291d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
291e0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
291f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
29200 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
29210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29220 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
29230 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
29240 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
29250 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
29260 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
29270 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
29280 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
29290 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
292a0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
292b0 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
292c0 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
292d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
292e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
292f0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
29300 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65  LE h;.#if define
29310 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
29320 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73  int nFull = pVfs
29330 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
29340 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
29350 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
29360 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f  o( nFull );.  vo
29370 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
29380 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d   0;.  if( zFull=
29390 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
293a0 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
293b0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
293c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
293d0 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
293e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
293f0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
29400 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
29410 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21  , nFull, zFull)!
29420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29430 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29440 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41  Full);.    OSTRA
29450 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
29460 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
29470 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
29480 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
29490 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43  turn 0;.  }.  zC
294a0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
294b0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
294c0 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  ename(zFull);.  
294d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
294e0 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69  ll);.#else.  voi
294f0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
29500 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
29510 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
29520 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
29530 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
29540 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43  .#endif.  if( zC
29550 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
29560 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
29570 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
29580 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
29590 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
295a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
295b0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
295c0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
295d0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
295e0 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
295f0 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
29600 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
29610 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
29620 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
29630 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
29640 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
29650 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
29660 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
29670 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
29680 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
29690 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
296a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
296b0 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
296c0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
296d0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
296e0 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c  void*)h));.  sql
296f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
29700 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
29710 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
29720 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
29730 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
29740 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
29750 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
29760 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29770 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47  ER(pVfs);.  winG
29780 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
29790 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
297a0 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
297b0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
297c0 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
297d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
297e0 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
297f0 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
29800 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20   FARPROC proc;. 
29810 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29820 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20  R(pVfs);.  proc 
29830 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  = osGetProcAddre
29840 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20  ssA((HANDLE)pH, 
29850 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45  zSym);.  OSTRACE
29860 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d  (("DLSYM handle=
29870 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61  %p, symbol=%s, a
29880 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20  ddress=%p\n",.  
29890 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
298a0 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a  pH, zSym, (void*
298b0 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72  )proc));.  retur
298c0 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
298d0 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20  )proc;.}.static 
298e0 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
298f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
29900 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
29910 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
29920 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
29930 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
29940 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20  NDLE)pHandle);. 
29950 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f   OSTRACE(("DLCLO
29960 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  SE handle=%p\n",
29970 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29   (void*)pHandle)
29980 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
29990 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
299a0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
299b0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
299c0 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
299d0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
299e0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
299f0 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
29a00 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
29a10 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  lose 0.#endif...
29a20 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
29a30 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
29a40 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
29a50 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
29a60 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
29a70 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
29a80 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
29a90 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
29aa0 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  t n = 0;.  UNUSE
29ab0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
29ac0 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
29ad0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20  QLITE_TEST).  n 
29ae0 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74  = nBuf;.  memset
29af0 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
29b00 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
29b10 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c  eof(SYSTEMTIME)<
29b20 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53  =nBuf-n ){.    S
29b30 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20  YSTEMTIME x;.   
29b40 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
29b50 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&x);.    memcpy
29b60 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73  (&zBuf[n], &x, s
29b70 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e  izeof(x));.    n
29b80 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20   += sizeof(x);. 
29b90 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
29ba0 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
29bb0 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20  {.    DWORD pid 
29bc0 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  = osGetCurrentPr
29bd0 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d  ocessId();.    m
29be0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29bf0 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
29c00 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29c10 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69  eof(pid);.  }.#i
29c20 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
29c30 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55  T.  if( sizeof(U
29c40 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d  LONGLONG)<=nBuf-
29c50 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f  n ){.    ULONGLO
29c60 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  NG cnt = osGetTi
29c70 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20  ckCount64();.   
29c80 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
29c90 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
29ca0 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
29cb0 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
29cc0 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
29cd0 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
29ce0 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63  n ){.    DWORD c
29cf0 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
29d00 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  unt();.    memcp
29d10 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
29d20 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
29d30 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
29d40 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  cnt);.  }.#endif
29d50 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41  .  if( sizeof(LA
29d60 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42  RGE_INTEGER)<=nB
29d70 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47  uf-n ){.    LARG
29d80 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20  E_INTEGER i;.   
29d90 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61   osQueryPerforma
29da0 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a  nceCounter(&i);.
29db0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
29dc0 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28  [n], &i, sizeof(
29dd0 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  i));.    n += si
29de0 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e  zeof(i);.  }.#en
29df0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  dif.  return n;.
29e00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
29e10 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
29e20 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
29e30 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
29e40 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
29e50 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c  int winSleep(sql
29e60 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
29e70 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20  int microsec){. 
29e80 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
29e90 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
29ea0 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55  99)/1000);.  UNU
29eb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29ec0 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fs);.  return ((
29ed0 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
29ee0 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
29ef0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
29f00 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
29f10 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
29f20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
29f30 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
29f40 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
29f50 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
29f60 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
29f70 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
29f80 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
29f90 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
29fa0 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
29fb0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
29fc0 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
29fd0 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
29fe0 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
29ff0 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
2a000 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
2a010 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
2a020 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
2a030 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
2a040 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
2a050 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
2a060 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
2a070 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
2a080 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
2a090 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
2a0a0 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
2a0b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
2a0c0 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
2a0d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
2a0e0 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
2a0f0 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
2a100 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
2a110 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
2a120 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
2a130 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
2a140 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
2a150 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
2a160 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
2a170 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
2a180 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
2a190 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
2a1a0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
2a1b0 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66  e.** cannot be f
2a1c0 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
2a1d0 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
2a1e0 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
2a1f0 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
2a200 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
2a210 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20  {.  /* FILETIME 
2a220 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36  structure is a 6
2a230 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72  4-bit value repr
2a240 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d  esenting the num
2a250 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d  ber of.     100-
2a260 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
2a270 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
2a280 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
2a290 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a   2305813.5)..  *
2a2a0 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b  /.  FILETIME ft;
2a2b0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2a2c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69  sqlite3_int64 wi
2a2d0 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d  nFiletimeEpoch =
2a2e0 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74   23058135*(sqlit
2a2f0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
2a300 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2a310 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f  TEST.  static co
2a320 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2a330 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
2a340 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
2a350 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
2a360 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20  endif.  /* 2^32 
2a370 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f  - to avoid use o
2a380 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67  f LL and warning
2a390 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74  s in gcc */.  st
2a3a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a3b0 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69  e3_int64 max32Bi
2a3c0 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28  tValue =.      (
2a3d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
2a3e0 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
2a3f0 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
2a400 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71  0000 +.      (sq
2a410 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39  lite3_int64)2949
2a420 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49  67296;..#if SQLI
2a430 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59  TE_OS_WINCE.  SY
2a440 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20  STEMTIME time;. 
2a450 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2a460 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66  (&time);.  /* if
2a470 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c   SystemTimeToFil
2a480 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69  eTime() fails, i
2a490 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  t returns zero. 
2a4a0 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74  */.  if (!osSyst
2a4b0 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
2a4c0 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20  (&time,&ft)){.  
2a4d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a4e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65  ERROR;.  }.#else
2a4f0 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  .  osGetSystemTi
2a500 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66  meAsFileTime( &f
2a510 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a  t );.#endif..  *
2a520 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74  piNow = winFilet
2a530 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20  imeEpoch +.     
2a540 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74         ((((sqlit
2a550 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69  e3_int64)ft.dwHi
2a560 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33  ghDateTime)*max3
2a570 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20  2BitValue) +.   
2a580 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2a590 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
2a5a0 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
2a5b0 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
2a5c0 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
2a5d0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
2a5e0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2a5f0 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
2a600 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
2a610 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
2a620 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
2a630 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
2a640 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
2a650 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
2a660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
2a680 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2a690 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2a6a0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2a6b0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
2a6c0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2a6d0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2a6e0 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
2a6f0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
2a700 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
2a710 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
2a720 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
2a730 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2a740 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
2a750 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
2a760 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
2a770 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
2a780 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
2a790 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
2a7a0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2a7b0 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
2a7c0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
2a7d0 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
2a7e0 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
2a7f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2a800 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
2a810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
2a820 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
2a830 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
2a840 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
2a850 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
2a860 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n Windows (or er
2a870 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
2a880 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29  ror_r() on Unix)
2a890 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
2a8a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2a8b0 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
2a8c0 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
2a8d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2a8e0 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
2a8f0 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
2a900 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
2a910 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
2a920 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
2a930 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
2a940 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2a950 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
2a960 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
2a970 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
2a980 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
2a990 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
2a9a0 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
2a9b0 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
2a9c0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
2a9d0 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
2a9e0 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
2a9f0 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
2aa00 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
2aa10 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
2aa20 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
2aa30 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
2aa40 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
2aa50 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
2aa60 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
2aa70 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
2aa80 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
2aa90 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
2aaa0 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
2aab0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
2aac0 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
2aad0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
2aae0 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
2aaf0 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
2ab00 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
2ab10 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
2ab20 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
2ab30 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2ab40 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
2ab50 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
2ab60 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
2ab70 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
2ab80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ab90 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
2aba0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
2abb0 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
2abc0 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
2abd0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2abe0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2abf0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
2ac00 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
2ac10 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
2ac20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
2ac30 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
2ac40 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
2ac50 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
2ac60 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
2ac70 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
2ac80 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
2ac90 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
2aca0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2acb0 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
2acc0 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
2acd0 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
2ace0 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
2acf0 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
2ad00 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
2ad10 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2ad20 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2ad30 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2ad40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ad50 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2ad60 75 72 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72  urn winGetLastEr
2ad70 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
2ad80 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
2ad90 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Buf);.}../*.** I
2ada0 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65  nitialize and de
2adb0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  initialize the o
2adc0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2add0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
2ade0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  t sqlite3_os_ini
2adf0 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
2ae00 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
2ae10 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  nVfs = {.    3, 
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae30 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2ae40 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2ae50 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
2ae60 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
2ae70 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
2ae80 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
2ae90 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
2aea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2aeb0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2aec0 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
2aed0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
2aee0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2af00 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2af10 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2af20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
2af30 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
2af40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2af50 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2af60 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2af70 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2af80 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2af90 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
2afa0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2afb0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2afc0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2afd0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
2afe0 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
2aff0 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2b000 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2b010 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2b020 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2b030 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2b040 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2b050 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2b060 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
2b070 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
2b080 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2b090 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
2b0a0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
2b0b0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2b0c0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2b0d0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2b0e0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2b0f0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2b100 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
2b110 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2b120 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
2b130 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2b140 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2b150 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2b160 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2b170 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
2b180 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
2b190 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
2b1a0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2b1b0 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64    };.#if defined
2b1c0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2b1d0 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63  S_WIDE).  static
2b1e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2b1f0 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a  LongPathVfs = {.
2b200 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
2b210 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2b220 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2b230 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2b240 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2b250 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54      SQLITE_WINNT
2b260 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2b270 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2b280 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2b290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2b2a0 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2b2b0 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20  2-longpath",    
2b2c0 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2b2d0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2b2e0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2b2f0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b310 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
2b320 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2b330 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2b340 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2b350 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2b360 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
2b370 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
2b380 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2b390 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2b3a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
2b3b0 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2b3c0 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2b3d0 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2b3e0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b400 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2b410 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2b420 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2b430 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2b440 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
2b450 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
2b460 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
2b470 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2b480 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2b490 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
2b4a0 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
2b4b0 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
2b4c0 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
2b4d0 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2b4e0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2b4f0 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
2b500 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2b510 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2b520 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
2b530 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2b540 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2b550 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2b560 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2b570 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2b580 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2b590 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64  all */.  };.#end
2b5a0 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  if..  /* Double-
2b5b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
2b5c0 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
2b5d0 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
2b5e0 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
2b5f0 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
2b600 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
2b610 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
2b620 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
2b630 63 61 6c 6c 29 3d 3d 37 37 20 29 3b 0a 0a 20 20  call)==77 );..  
2b640 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
2b650 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
2b660 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
2b670 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
2b680 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
2b690 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53  EM_INFO));.#if S
2b6a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2b6b0 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
2b6c0 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
2b6d0 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47  fo);.#else.  osG
2b6e0 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
2b6f0 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69  nSysInfo);.#endi
2b700 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  f.  assert( winS
2b710 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
2b720 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30  ionGranularity>0
2b730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69   );.  assert( wi
2b740 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
2b750 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ize>0 );..  sqli
2b760 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2b770 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23  (&winVfs, 1);..#
2b780 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2b790 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2b7a0 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ).  sqlite3_vfs_
2b7b0 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e  register(&winLon
2b7c0 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65  gPathVfs, 0);.#e
2b7d0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
2b7e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  QLITE_OK;.}..int
2b7f0 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
2b800 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54  void){.#if SQLIT
2b810 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
2b820 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
2b830 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  ){.    osCloseHa
2b840 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a  ndle(sleepObj);.
2b850 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e      sleepObj = N
2b860 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ULL;.  }.#endif.
2b870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b880 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
2b890 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
2b8a0 2f 0a                                            /.