/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 43b075157eb17440a1813a14332fc8623d7c4554:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73 74 20 6f  /*.** Are most o
03e0: 66 20 74 68 65 20 57 69 6e 33 32 20 41 4e 53 49  f the Win32 ANSI
03f0: 20 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20   APIs available 
0400: 28 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61  (i.e. with certa
0410: 69 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a  in exceptions.**
0420: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75   based on the su
0430: 62 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a  b-platform)?.*/.
0440: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
0450: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
0460: 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66  OS_WINRT && !def
0470: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
0480: 32 5f 4e 4f 5f 41 4e 53 49 29 0a 23 20 20 64 65  2_NO_ANSI).#  de
0490: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
04a0: 32 5f 48 41 53 5f 41 4e 53 49 0a 23 65 6e 64 69  2_HAS_ANSI.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65 20 6d 6f 73  f../*.** Are mos
04c0: 74 20 6f 66 20 74 68 65 20 57 69 6e 33 32 20 55  t of the Win32 U
04d0: 6e 69 63 6f 64 65 20 41 50 49 73 20 61 76 61 69  nicode APIs avai
04e0: 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74 68  lable (i.e. with
04f0: 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74 69   certain excepti
0500: 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ons.** based on 
0510: 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  the sub-platform
0520: 29 3f 0a 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54  )?.*/.#if (SQLIT
0530: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
0540: 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e 54 20 7c 7c  LITE_OS_WINNT ||
0550: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
0560: 29 20 26 26 20 5c 0a 20 20 20 20 21 64 65 66 69  ) && \.    !defi
0570: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0580: 5f 4e 4f 5f 57 49 44 45 29 0a 23 20 20 64 65 66  _NO_WIDE).#  def
0590: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
05a0: 5f 48 41 53 5f 57 49 44 45 0a 23 65 6e 64 69 66  _HAS_WIDE.#endif
05b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
05c0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 73  e at least one s
05d0: 65 74 20 6f 66 20 57 69 6e 33 32 20 41 50 49 73  et of Win32 APIs
05e0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
05f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
0600: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0610: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
0620: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
0630: 41 53 5f 57 49 44 45 29 0a 23 20 20 65 72 72 6f  AS_WIDE).#  erro
0640: 72 20 22 41 74 20 6c 65 61 73 74 20 6f 6e 65 20  r "At least one 
0650: 6f 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  of SQLITE_WIN32_
0660: 48 41 53 5f 41 4e 53 49 20 61 6e 64 20 53 51 4c  HAS_ANSI and SQL
0670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0680: 44 45 5c 0a 20 6d 75 73 74 20 62 65 20 64 65 66  DE\. must be def
0690: 69 6e 65 64 2e 22 0a 23 65 6e 64 69 66 0a 0a 2f  ined.".#endif../
06a0: 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 74 68 65 20  *.** Define the 
06b0: 72 65 71 75 69 72 65 64 20 57 69 6e 64 6f 77 73  required Windows
06c0: 20 53 44 4b 20 76 65 72 73 69 6f 6e 20 63 6f 6e   SDK version con
06d0: 73 74 61 6e 74 73 20 69 66 20 74 68 65 79 20 61  stants if they a
06e0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  re not.** alread
06f0: 79 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  y available..*/.
0700: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0710: 4e 38 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44  N8.#  define NTD
0720: 44 49 5f 57 49 4e 38 20 20 20 20 20 20 20 20 20  DI_WIN8         
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
0740: 78 30 36 30 32 30 30 30 30 0a 23 65 6e 64 69 66  x06020000.#endif
0750: 0a 0a 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f  ..#ifndef NTDDI_
0760: 57 49 4e 42 4c 55 45 0a 23 20 20 64 65 66 69 6e  WINBLUE.#  defin
0770: 65 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45 20  e NTDDI_WINBLUE 
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 20 30 78 30 36 30 33 30 30 30 30 0a 23      0x06030000.#
07a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  endif../*.** Che
07b0: 63 6b 20 69 66 20 74 68 65 20 47 65 74 56 65 72  ck if the GetVer
07c0: 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74  sionEx[AW] funct
07d0: 69 6f 6e 73 20 73 68 6f 75 6c 64 20 62 65 20 63  ions should be c
07e0: 6f 6e 73 69 64 65 72 65 64 20 64 65 70 72 65 63  onsidered deprec
07f0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 76 6f 69  ated.** and avoi
0800: 64 20 75 73 69 6e 67 20 74 68 65 6d 20 69 6e 20  d using them in 
0810: 74 68 61 74 20 63 61 73 65 2e 20 20 49 74 20 73  that case.  It s
0820: 68 6f 75 6c 64 20 62 65 20 6e 6f 74 65 64 20 68  hould be noted h
0830: 65 72 65 20 74 68 61 74 20 69 66 20 74 68 65 0a  ere that if the.
0840: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
0850: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0860: 56 45 52 53 49 4f 4e 45 58 20 70 72 65 2d 70 72  VERSIONEX pre-pr
0870: 6f 63 65 73 73 6f 72 20 6d 61 63 72 6f 20 69 73  ocessor macro is
0880: 20 7a 65 72 6f 0a 2a 2a 20 28 77 68 65 74 68 65   zero.** (whethe
0890: 72 20 76 69 61 20 74 68 69 73 20 62 6c 6f 63 6b  r via this block
08a0: 20 6f 72 20 76 69 61 20 62 65 69 6e 67 20 6d 61   or via being ma
08b0: 6e 75 61 6c 6c 79 20 73 70 65 63 69 66 69 65 64  nually specified
08c0: 29 2c 20 74 68 61 74 20 69 6d 70 6c 69 65 73 0a  ), that implies.
08d0: 2a 2a 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ** the underlyin
08e0: 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
08f0: 65 6d 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  em will always b
0900: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 57  e based on the W
0910: 69 6e 64 6f 77 73 20 4e 54 0a 2a 2a 20 4b 65 72  indows NT.** Ker
0920: 6e 65 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  nel..*/.#ifndef 
0930: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0940: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0950: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0960: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0970: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0980: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
0990: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09a0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09b0: 20 30 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20   0.#  else.#    
09c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
09d0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
09e0: 20 20 20 31 0a 23 20 20 65 6e 64 69 66 0a 23 65     1.#  endif.#e
09f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
0a00: 20 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75 6c 64   constant should
0a10: 20 61 6c 72 65 61 64 79 20 62 65 20 64 65 66 69   already be defi
0a20: 6e 65 64 20 28 69 6e 20 74 68 65 20 22 57 69 6e  ned (in the "Win
0a30: 44 65 66 2e 68 22 20 53 44 4b 20 66 69 6c 65 29  Def.h" SDK file)
0a40: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4d 41 58  ..*/.#ifndef MAX
0a50: 5f 50 41 54 48 0a 23 20 20 64 65 66 69 6e 65 20  _PATH.#  define 
0a60: 4d 41 58 5f 50 41 54 48 20 20 20 20 20 20 20 20  MAX_PATH        
0a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 32                (2
0a80: 36 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  60).#endif../*.*
0a90: 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61  * Maximum pathna
0aa0: 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68  me length (in ch
0ab0: 61 72 73 29 20 66 6f 72 20 57 69 6e 33 32 2e 20  ars) for Win32. 
0ac0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72   This should nor
0ad0: 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 4d 41 58 5f  mally be.** MAX_
0ae0: 50 41 54 48 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  PATH..*/.#ifndef
0af0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0b00: 58 5f 50 41 54 48 5f 43 48 41 52 53 0a 23 20 20  X_PATH_CHARS.#  
0b10: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0b20: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
0b30: 52 53 20 20 20 28 4d 41 58 5f 50 41 54 48 29 0a  RS   (MAX_PATH).
0b40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0b50: 69 73 20 63 6f 6e 73 74 61 6e 74 20 73 68 6f 75  is constant shou
0b60: 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 64 65  ld already be de
0b70: 66 69 6e 65 64 20 28 69 6e 20 74 68 65 20 22 57  fined (in the "W
0b80: 69 6e 4e 54 2e 68 22 20 53 44 4b 20 66 69 6c 65  inNT.h" SDK file
0b90: 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e  )..*/.#ifndef UN
0ba0: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0bb0: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0bc0: 20 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f   UNICODE_STRING_
0bd0: 4d 41 58 5f 43 48 41 52 53 20 20 20 20 20 20 28  MAX_CHARS      (
0be0: 33 32 37 36 37 29 0a 23 65 6e 64 69 66 0a 0a 2f  32767).#endif../
0bf0: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74  *.** Maximum pat
0c00: 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e  hname length (in
0c10: 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e 4e   chars) for WinN
0c20: 54 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  T.  This should 
0c30: 6e 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55  normally be.** U
0c40: 4e 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41  NICODE_STRING_MA
0c50: 58 5f 43 48 41 52 53 2e 0a 2a 2f 0a 23 69 66 6e  X_CHARS..*/.#ifn
0c60: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  def SQLITE_WINNT
0c70: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 0a  _MAX_PATH_CHARS.
0c80: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0c90: 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f  _WINNT_MAX_PATH_
0ca0: 43 48 41 52 53 20 20 20 28 55 4e 49 43 4f 44 45  CHARS   (UNICODE
0cb0: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0cc0: 53 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  S).#endif../*.**
0cd0: 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d   Maximum pathnam
0ce0: 65 20 6c 65 6e 67 74 68 20 28 69 6e 20 62 79 74  e length (in byt
0cf0: 65 73 29 20 66 6f 72 20 57 69 6e 33 32 2e 20 20  es) for Win32.  
0d00: 54 68 65 20 4d 41 58 5f 50 41 54 48 20 6d 61 63  The MAX_PATH mac
0d10: 72 6f 20 69 73 20 69 6e 0a 2a 2a 20 63 68 61 72  ro is in.** char
0d20: 61 63 74 65 72 73 2c 20 73 6f 20 77 65 20 61 6c  acters, so we al
0d30: 6c 6f 63 61 74 65 20 34 20 62 79 74 65 73 20 70  locate 4 bytes p
0d40: 65 72 20 63 68 61 72 61 63 74 65 72 20 61 73 73  er character ass
0d50: 75 6d 69 6e 67 20 77 6f 72 73 74 2d 63 61 73 65  uming worst-case
0d60: 20 6f 66 0a 2a 2a 20 34 2d 62 79 74 65 73 2d 70   of.** 4-bytes-p
0d70: 65 72 2d 63 68 61 72 61 63 74 65 72 20 66 6f 72  er-character for
0d80: 20 55 54 46 38 2e 0a 2a 2f 0a 23 69 66 6e 64 65   UTF8..*/.#ifnde
0d90: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
0da0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 0a 23 20  AX_PATH_BYTES.# 
0db0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
0dc0: 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59  IN32_MAX_PATH_BY
0dd0: 54 45 53 20 20 20 28 53 51 4c 49 54 45 5f 57 49  TES   (SQLITE_WI
0de0: 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41  N32_MAX_PATH_CHA
0df0: 52 53 2a 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RS*4).#endif../*
0e00: 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68  .** Maximum path
0e10: 6e 61 6d 65 20 6c 65 6e 67 74 68 20 28 69 6e 20  name length (in 
0e20: 62 79 74 65 73 29 20 66 6f 72 20 57 69 6e 4e 54  bytes) for WinNT
0e30: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .  This should n
0e40: 6f 72 6d 61 6c 6c 79 20 62 65 0a 2a 2a 20 55 4e  ormally be.** UN
0e50: 49 43 4f 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58  ICODE_STRING_MAX
0e60: 5f 43 48 41 52 53 20 2a 20 73 69 7a 65 6f 66 28  _CHARS * sizeof(
0e70: 57 43 48 41 52 29 2e 0a 2a 2f 0a 23 69 66 6e 64  WCHAR)..*/.#ifnd
0e80: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ef SQLITE_WINNT_
0e90: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 0a 23  MAX_PATH_BYTES.#
0ea0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0eb0: 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
0ec0: 59 54 45 53 20 20 20 5c 0a 20 20 20 20 20 20 20  YTES   \.       
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ee0: 20 20 20 20 20 28 73 69 7a 65 6f 66 28 57 43 48       (sizeof(WCH
0ef0: 41 52 29 20 2a 20 53 51 4c 49 54 45 5f 57 49 4e  AR) * SQLITE_WIN
0f00: 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52  NT_MAX_PATH_CHAR
0f10: 53 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  S).#endif../*.**
0f20: 20 4d 61 78 69 6d 75 6d 20 65 72 72 6f 72 20 6d   Maximum error m
0f30: 65 73 73 61 67 65 20 6c 65 6e 67 74 68 20 28 69  essage length (i
0f40: 6e 20 63 68 61 72 73 29 20 66 6f 72 20 57 69 6e  n chars) for Win
0f50: 52 54 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  RT..*/.#ifndef S
0f60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
0f70: 45 52 52 4d 53 47 5f 43 48 41 52 53 0a 23 20 20  ERRMSG_CHARS.#  
0f80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
0f90: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
0fa0: 48 41 52 53 20 28 31 30 32 34 29 0a 23 65 6e 64  HARS (1024).#end
0fb0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
0fc0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
0fd0: 65 20 63 68 61 72 61 63 74 65 72 20 73 68 6f 75  e character shou
0fe0: 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ld be treated as
0ff0: 20 61 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20   a directory.** 
1000: 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2f 0a 23 69  separator..*/.#i
1010: 66 6e 64 65 66 20 77 69 6e 49 73 44 69 72 53 65  fndef winIsDirSe
1020: 70 0a 23 20 20 64 65 66 69 6e 65 20 77 69 6e 49  p.#  define winI
1030: 73 44 69 72 53 65 70 28 61 29 20 20 20 20 20 20  sDirSep(a)      
1040: 20 20 20 20 20 20 20 20 20 20 28 28 28 61 29 20            (((a) 
1050: 3d 3d 20 27 2f 27 29 20 7c 7c 20 28 28 61 29 20  == '/') || ((a) 
1060: 3d 3d 20 27 5c 5c 27 29 29 0a 23 65 6e 64 69 66  == '\\')).#endif
1070: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
1080: 72 6f 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ro is used when 
1090: 61 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  a local variable
10a0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 76 61 6c   is set to a val
10b0: 75 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 5b 73  ue that is.** [s
10c0: 6f 6d 65 74 69 6d 65 73 5d 20 6e 6f 74 20 75 73  ometimes] not us
10d0: 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20 28  ed by the code (
10e0: 65 2e 67 2e 20 76 69 61 20 63 6f 6e 64 69 74 69  e.g. via conditi
10f0: 6f 6e 61 6c 20 63 6f 6d 70 69 6c 61 74 69 6f 6e  onal compilation
1100: 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 4e  )..*/.#ifndef UN
1110: 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1120: 4c 55 45 0a 23 20 20 64 65 66 69 6e 65 20 55 4e  LUE.#  define UN
1130: 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1140: 4c 55 45 28 78 29 20 28 76 6f 69 64 29 28 78 29  LUE(x) (void)(x)
1150: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1160: 65 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61  eturns the chara
1170: 63 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  cter that should
1180: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
1190: 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
11a0: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
11b0: 77 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20  winGetDirSep.#  
11c0: 64 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72  define winGetDir
11d0: 53 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20  Sep()           
11e0: 20 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66       '\\'.#endif
11f0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65  ../*.** Do we ne
1200: 65 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64  ed to manually d
1210: 65 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20  efine the Win32 
1220: 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49  file mapping API
1230: 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57  s for use with W
1240: 41 4c 0a 2a 2a 20 6d 6f 64 65 20 28 65 2e 67 2e  AL.** mode (e.g.
1250: 20 74 68 65 73 65 20 41 50 49 73 20 61 72 65 20   these APIs are 
1260: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
1270: 20 57 69 6e 64 6f 77 73 20 43 45 20 53 44 4b 3b   Windows CE SDK;
1280: 20 68 6f 77 65 76 65 72 2c 20 74 68 65 79 0a 2a   however, they.*
1290: 2a 20 61 72 65 20 6e 6f 74 20 70 72 65 73 65 6e  * are not presen
12a0: 74 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  t in the header 
12b0: 66 69 6c 65 29 3f 0a 2a 2f 0a 23 69 66 20 53 51  file)?.*/.#if SQ
12c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 46 49 4c 45 4d  LITE_WIN32_FILEM
12d0: 41 50 50 49 4e 47 5f 41 50 49 20 26 26 20 21 64  APPING_API && !d
12e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12f0: 49 54 5f 57 41 4c 29 0a 2f 2a 0a 2a 2a 20 54 77  IT_WAL)./*.** Tw
1300: 6f 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6d 61  o of the file ma
1310: 70 70 69 6e 67 20 41 50 49 73 20 61 72 65 20 64  pping APIs are d
1320: 69 66 66 65 72 65 6e 74 20 75 6e 64 65 72 20 57  ifferent under W
1330: 69 6e 52 54 2e 20 20 46 69 67 75 72 65 20 6f 75  inRT.  Figure ou
1340: 74 20 77 68 69 63 68 0a 2a 2a 20 73 65 74 20 77  t which.** set w
1350: 65 20 6e 65 65 64 2e 0a 2a 2f 0a 23 69 66 20 53  e need..*/.#if S
1360: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 57  QLITE_OS_WINRT.W
1370: 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45  INBASEAPI HANDLE
1380: 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46 69   WINAPI CreateFi
1390: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
13a0: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
13b0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
13c0: 54 52 49 42 55 54 45 53 2c 20 55 4c 4f 4e 47 2c  TRIBUTES, ULONG,
13d0: 20 55 4c 4f 4e 47 36 34 2c 20 4c 50 43 57 53 54   ULONG64, LPCWST
13e0: 52 29 3b 0a 0a 57 49 4e 42 41 53 45 41 50 49 20  R);..WINBASEAPI 
13f0: 4c 50 56 4f 49 44 20 57 49 4e 41 50 49 20 4d 61  LPVOID WINAPI Ma
1400: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
1410: 70 70 28 48 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47  pp(HANDLE, ULONG
1420: 2c 20 55 4c 4f 4e 47 36 34 2c 20 53 49 5a 45 5f  , ULONG64, SIZE_
1430: 54 29 3b 0a 23 65 6c 73 65 0a 23 69 66 20 64 65  T);.#else.#if de
1440: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1450: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 57 49 4e  32_HAS_ANSI).WIN
1460: 42 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57  BASEAPI HANDLE W
1470: 49 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65  INAPI CreateFile
1480: 4d 61 70 70 69 6e 67 41 28 48 41 4e 44 4c 45 2c  MappingA(HANDLE,
1490: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
14a0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
14b0: 20 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20    DWORD, DWORD, 
14c0: 44 57 4f 52 44 2c 20 4c 50 43 53 54 52 29 3b 0a  DWORD, LPCSTR);.
14d0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
14e0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
14f0: 41 53 5f 41 4e 53 49 29 20 2a 2f 0a 0a 23 69 66  AS_ANSI) */..#if
1500: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1510: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
1520: 57 49 4e 42 41 53 45 41 50 49 20 48 41 4e 44 4c  WINBASEAPI HANDL
1530: 45 20 57 49 4e 41 50 49 20 43 72 65 61 74 65 46  E WINAPI CreateF
1540: 69 6c 65 4d 61 70 70 69 6e 67 57 28 48 41 4e 44  ileMappingW(HAND
1550: 4c 45 2c 20 4c 50 53 45 43 55 52 49 54 59 5f 41  LE, LPSECURITY_A
1560: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
1570: 20 20 20 20 20 44 57 4f 52 44 2c 20 44 57 4f 52       DWORD, DWOR
1580: 44 2c 20 44 57 4f 52 44 2c 20 4c 50 43 57 53 54  D, DWORD, LPCWST
1590: 52 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  R);.#endif /* de
15a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
15b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 2a 2f 0a  32_HAS_WIDE) */.
15c0: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
15d0: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
15e0: 77 4f 66 46 69 6c 65 28 48 41 4e 44 4c 45 2c 20  wOfFile(HANDLE, 
15f0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
1600: 4f 52 44 2c 20 53 49 5a 45 5f 54 29 3b 0a 23 65  ORD, SIZE_T);.#e
1610: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1620: 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINRT */../*.*
1630: 2a 20 54 68 69 73 20 66 69 6c 65 20 6d 61 70 70  * This file mapp
1640: 69 6e 67 20 41 50 49 20 69 73 20 63 6f 6d 6d 6f  ing API is commo
1650: 6e 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20  n to both Win32 
1660: 61 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 57 49  and WinRT..*/.WI
1670: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
1680: 4e 41 50 49 20 55 6e 6d 61 70 56 69 65 77 4f 66  NAPI UnmapViewOf
1690: 46 69 6c 65 28 4c 50 43 56 4f 49 44 29 3b 0a 23  File(LPCVOID);.#
16a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16b0: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
16c0: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
16d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
16e0: 4c 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  L) */../*.** Som
16f0: 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
1700: 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
1710: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
1720: 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 46  ifndef INVALID_F
1730: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 0a 23  ILE_ATTRIBUTES.#
1740: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
1750: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
1760: 28 28 44 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e  ((DWORD)-1) .#en
1770: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c  dif..#ifndef FIL
1780: 45 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65  E_FLAG_MASK.# de
1790: 66 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d  fine FILE_FLAG_M
17a0: 41 53 4b 20 20 20 20 20 20 20 20 20 20 28 30 78  ASK          (0x
17b0: 46 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66  FF3C0000).#endif
17c0: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41  ..#ifndef FILE_A
17d0: 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20  TTRIBUTE_MASK.# 
17e0: 64 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52  define FILE_ATTR
17f0: 49 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28  IBUTE_MASK     (
1800: 30 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64  0x0003FFF7).#end
1810: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1820: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46  TE_OMIT_WAL./* F
1830: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1840: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 73 20  s to structures 
1850: 75 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a  used for WAL */.
1860: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
1870: 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20  inShm winShm;   
1880: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e          /* A con
1890: 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
18a0: 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d-memory */.type
18b0: 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68  def struct winSh
18c0: 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65  mNode winShmNode
18d0: 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20  ;   /* A region 
18e0: 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
18f0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
1900: 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61  * WinCE lacks na
1910: 74 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72  tive support for
1920: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f   file locking so
1930: 20 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65   we have to fake
1940: 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65   it.** with some
1950: 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e   code of our own
1960: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
1970: 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66  OS_WINCE.typedef
1980: 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63   struct winceLoc
1990: 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65  k {.  int nReade
19a0: 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  rs;       /* Num
19b0: 62 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f  ber of reader lo
19c0: 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a  cks obtained */.
19d0: 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b    BOOL bPending;
19e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74        /* Indicat
19f0: 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  es a pending loc
1a00: 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69  k has been obtai
1a10: 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  ned */.  BOOL bR
1a20: 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20  eserved;     /* 
1a30: 49 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65  Indicates a rese
1a40: 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65  rved lock has be
1a50: 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  en obtained */. 
1a60: 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65   BOOL bExclusive
1a70: 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65  ;    /* Indicate
1a80: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1a90: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
1aa0: 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65  ained */.} wince
1ab0: 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  Lock;.#endif../*
1ac0: 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20  .** The winFile 
1ad0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73  structure is a s
1ae0: 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74  ubclass of sqlit
1af0: 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69  e3_file* specifi
1b00: 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a  c to the win32.*
1b10: 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61  * portability la
1b20: 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  yer..*/.typedef 
1b30: 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77  struct winFile w
1b40: 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77  inFile;.struct w
1b50: 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74  inFile {.  const
1b60: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1b70: 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a  ods *pMethod; /*
1b80: 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  ** Must be first
1b90: 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   ***/.  sqlite3_
1ba0: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1bb0: 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20  /* The VFS used 
1bc0: 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c  to open this fil
1bd0: 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b  e */.  HANDLE h;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bf0: 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63  * Handle for acc
1c00: 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  essing the file 
1c10: 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65  */.  u8 locktype
1c20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1c30: 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72  Type of lock cur
1c40: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74  rently held on t
1c50: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68  his file */.  sh
1c60: 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  ort sharedLockBy
1c70: 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c  te;   /* Randoml
1c80: 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73  y chosen byte us
1c90: 65 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c  ed as a shared l
1ca0: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c  ock */.  u8 ctrl
1cb0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
1cc0: 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20   /* Flags.  See 
1cd0: 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20  WINFILE_* below 
1ce0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
1cf0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20  rrno;        /* 
1d00: 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
1d10: 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1d20: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66  I/O error */.#if
1d30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d40: 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70  _WAL.  winShm *p
1d50: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Shm;           /
1d60: 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68  * Instance of sh
1d70: 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74  ared memory on t
1d80: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  his file */.#end
1d90: 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  if.  const char 
1da0: 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20  *zPath;      /* 
1db0: 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  Full pathname of
1dc0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1dd0: 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20  int szChunk;    
1de0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b          /* Chunk
1df0: 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64   size configured
1e00: 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f   by FCNTL_CHUNK_
1e10: 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49  SIZE */.#if SQLI
1e20: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50  TE_OS_WINCE.  LP
1e30: 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c  WSTR zDeleteOnCl
1e40: 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ose;  /* Name of
1e50: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
1e60: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
1e70: 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b    HANDLE hMutex;
1e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74            /* Mut
1e90: 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  ex used to contr
1ea0: 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61  ol access to sha
1eb0: 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a 20 20  red lock */  .  
1ec0: 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64 3b 20  HANDLE hShared; 
1ed0: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1ee0: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1ef0: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
1f00: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b  g */.  winceLock
1f10: 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20 20 2f   local;        /
1f20: 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64  * Locks obtained
1f30: 20 62 79 20 74 68 69 73 20 69 6e 73 74 61 6e 63   by this instanc
1f40: 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a  e of winFile */.
1f50: 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61    winceLock *sha
1f60: 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f  red;      /* Glo
1f70: 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  bal shared lock 
1f80: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 66  memory for the f
1f90: 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  ile  */.#endif.#
1fa0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1fb0: 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20  AP_SIZE>0.  int 
1fc0: 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20  nFetchOut;      
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1fe0: 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ber of outstandi
1ff0: 6e 67 20 78 46 65 74 63 68 20 72 65 66 65 72 65  ng xFetch refere
2000: 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  nces */.  HANDLE
2010: 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
2020: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
2030: 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20  e for accessing 
2040: 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a  memory mapping *
2050: 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52 65  /.  void *pMapRe
2060: 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
2070: 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79    /* Area memory
2080: 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c   mapped */.  sql
2090: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
20a0: 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  ize;       /* Us
20b0: 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70  able size of map
20c0: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
20d0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
20e0: 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a  apSizeActual; /*
20f0: 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   Actual size of 
2100: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f  mapped region */
2110: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2120: 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20   mmapSizeMax;   
2130: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46   /* Configured F
2140: 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76  CNTL_MMAP_SIZE v
2150: 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
2160: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
2170: 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69 6e 46   values for winF
2180: 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f  ile.ctrlFlags.*/
2190: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
21a0: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20 20 20  _RDONLY         
21b0: 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65   0x02   /* Conne
21c0: 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e  ction is read on
21d0: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ly */.#define WI
21e0: 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
21f0: 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20  L     0x04   /* 
2200: 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20 6d  Persistent WAL m
2210: 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ode */.#define W
2220: 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20  INFILE_PSOW     
2230: 20 20 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a         0x10   /*
2240: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2250: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2260: 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  E */../*. * The 
2270: 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
2280: 65 72 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  er used by sqlit
2290: 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64  e3_win32_write_d
22a0: 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e  ebug().. */.#ifn
22b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
22c0: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20  _DBG_BUF_SIZE.# 
22d0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
22e0: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
22f0: 45 20 20 20 28 28 69 6e 74 29 28 34 30 39 36 2d  E   ((int)(4096-
2300: 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 29 0a  sizeof(DWORD))).
2310: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2320: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
2330: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
2340: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
2350: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
2360: 20 2a 20 74 68 65 20 64 61 74 61 20 64 69 72 65   * the data dire
2370: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
2380: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
2390: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
23a0: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
23b0: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
23c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
23d0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
23e0: 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (1).#endif../*.
23f0: 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73 65   * The value use
2400: 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f 77  d with sqlite3_w
2410: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
2420: 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79 20  ry() to specify 
2430: 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65 6d 70  that. * the temp
2440: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
2450: 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65  should be change
2460: 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  d.. */.#ifndef S
2470: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
2480: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
2490: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
24a0: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
24b0: 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29 0a 23  CTORY_TYPE (2).#
24c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20  endif../*. * If 
24d0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
24e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
24f0: 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65  C on Windows, we
2500: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a   will use the. *
2510: 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32 20 41   various Win32 A
2520: 50 49 20 68 65 61 70 20 66 75 6e 63 74 69 6f 6e  PI heap function
2530: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 75 72  s instead of our
2540: 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66   own.. */.#ifdef
2550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2560: 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74  LLOC../*. * If t
2570: 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  his is non-zero,
2580: 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61   an isolated hea
2590: 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65  p will be create
25a0: 64 20 62 79 20 74 68 65 20 6e 61 74 69 76 65 20  d by the native 
25b0: 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74  Win32. * allocat
25c0: 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20 6f 74  or subsystem; ot
25d0: 68 65 72 77 69 73 65 2c 20 74 68 65 20 64 65 66  herwise, the def
25e0: 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68 65 61  ault process hea
25f0: 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 20  p will be used. 
2600: 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69 6e 67   This. * setting
2610: 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 77   has no effect w
2620: 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f  hen compiling fo
2630: 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64 65 66  r WinRT.  By def
2640: 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20 65 6e  ault, this is en
2650: 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20  abled. * and an 
2660: 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69  isolated heap wi
2670: 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 74 6f  ll be created to
2680: 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63   store all alloc
2690: 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a  ated data.. *. *
26a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a  *************. *
26f0: 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69 73 20   WARNING: It is 
2700: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74  important to not
2710: 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2720: 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d   setting is non-
2730: 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20  zero and the. * 
2740: 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65 6d 53           winMemS
2750: 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e  hutdown function
2760: 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e   is called (e.g.
2770: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
2780: 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20  shutdown. *     
2790: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20       function), 
27a0: 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20 77 61  all data that wa
27b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  s allocated usin
27c0: 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64 20 68  g the isolated h
27d0: 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  eap will. *     
27e0: 20 20 20 20 20 62 65 20 66 72 65 65 64 20 69 6d       be freed im
27f0: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 61 6e  mediately and an
2800: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 63  y attempt to acc
2810: 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61 74 20  ess any of that 
2820: 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20 20 20  freed. *        
2830: 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f    data will almo
2840: 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72 65 73  st certainly res
2850: 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69  ult in an immedi
2860: 61 74 65 20 61 63 63 65 73 73 20 76 69 6f 6c 61  ate access viola
2870: 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion.. *********
2880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c0: 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65  *****. */.#ifnde
28d0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
28e0: 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20 64 65  EAP_CREATE.#  de
28f0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2900: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20 20 20  2_HEAP_CREATE   
2910: 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a   (TRUE).#endif..
2920: 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74 69 61  /*. * The initia
2930: 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  l size of the Wi
2940: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
2950: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
2960: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
2970: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2980: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53  IN32_HEAP_INIT_S
2990: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
29a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
29b0: 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51 4c 49  INIT_SIZE ((SQLI
29c0: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
29d0: 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20  _SIZE) * \.     
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c    (SQLITE_DEFAUL
2a10: 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b 20 34  T_PAGE_SIZE) + 4
2a20: 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a  194304).#endif..
2a30: 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*. * The maximu
2a40: 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 69  m size of the Wi
2a50: 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68 65 61  n32-specific hea
2a60: 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  p.  This value m
2a70: 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a  ay be zero.. */.
2a80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2a90: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
2aa0: 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  ZE.#  define SQL
2ab0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
2ac0: 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23 65 6e  AX_SIZE  (0).#en
2ad0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65  dif../*. * The e
2ae0: 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20 75 73  xtra flags to us
2af0: 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68  e in calls to th
2b00: 65 20 57 69 6e 33 32 20 68 65 61 70 20 41 50 49  e Win32 heap API
2b10: 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d  s.  This value m
2b20: 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f  ay be. * zero fo
2b30: 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 65  r the default be
2b40: 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e  havior.. */.#ifn
2b50: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2b60: 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20 20 64  _HEAP_FLAGS.#  d
2b70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2b80: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20 20 20  32_HEAP_FLAGS   
2b90: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f    (0).#endif.../
2ba0: 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44  *.** The winMemD
2bb0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73 74  ata structure st
2bc0: 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ores information
2bd0: 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2be0: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a   Win32-specific.
2bf0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  ** sqlite3_mem_m
2c00: 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74  ethods implement
2c10: 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ation..*/.typede
2c20: 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44  f struct winMemD
2c30: 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a  ata winMemData;.
2c40: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
2c50: 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  a {.#ifndef NDEB
2c60: 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b  UG.  u32 magic1;
2c70: 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62     /* Magic numb
2c80: 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72  er to detect str
2c90: 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f  ucture corruptio
2ca0: 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48  n. */.#endif.  H
2cb0: 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20  ANDLE hHeap; /* 
2cc0: 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75  The handle to ou
2cd0: 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f  r heap. */.  BOO
2ce0: 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f  L bOwned;  /* Do
2cf0: 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70   we own the heap
2d00: 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69   (i.e. destroy i
2d10: 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20  t on shutdown)? 
2d20: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2d30: 47 0a 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20  G.  u32 magic2; 
2d40: 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65    /* Magic numbe
2d50: 72 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75  r to detect stru
2d60: 63 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e  cture corruption
2d70: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  . */.#endif.};..
2d80: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
2d90: 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41  define WINMEM_MA
2da0: 47 49 43 31 20 20 20 20 20 30 78 34 32 62 32 38  GIC1     0x42b28
2db0: 33 30 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d  30b.#define WINM
2dc0: 45 4d 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78  EM_MAGIC2     0x
2dd0: 62 64 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a  bd4d7cf4.#endif.
2de0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77  .static struct w
2df0: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65  inMemData win_me
2e00: 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64  m_data = {.#ifnd
2e10: 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d  ef NDEBUG.  WINM
2e20: 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69  EM_MAGIC1,.#endi
2e30: 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a  f.  NULL, FALSE.
2e40: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2e50: 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a   ,WINMEM_MAGIC2.
2e60: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64  #endif.};..#ifnd
2e70: 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e  ef NDEBUG.#defin
2e80: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2e90: 67 69 63 31 28 29 20 61 73 73 65 72 74 28 20 77  gic1() assert( w
2ea0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
2eb0: 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c1==WINMEM_MAGIC
2ec0: 31 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  1 ).#define winM
2ed0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32 28 29  emAssertMagic2()
2ee0: 20 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d   assert( win_mem
2ef0: 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49  _data.magic2==WI
2f00: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64  NMEM_MAGIC2 ).#d
2f10: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65  efine winMemAsse
2f20: 72 74 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65  rtMagic()  winMe
2f30: 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b  mAssertMagic1();
2f40: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
2f50: 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65  ic2();.#else.#de
2f60: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2f70: 74 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a  tMagic().#endif.
2f80: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
2f90: 65 74 44 61 74 61 50 74 72 28 29 20 20 26 77 69  etDataPtr()  &wi
2fa0: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69  n_mem_data.#defi
2fb0: 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  ne winMemGetHeap
2fc0: 28 29 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64  ()     win_mem_d
2fd0: 61 74 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e  ata.hHeap.#defin
2fe0: 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  e winMemGetOwned
2ff0: 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61  ()    win_mem_da
3000: 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69  ta.bOwned..stati
3010: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61  c void *winMemMa
3020: 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29  lloc(int nBytes)
3030: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  ;.static void wi
3040: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
3050: 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76  Prior);.static v
3060: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
3070: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
3080: 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74   int nBytes);.st
3090: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53  atic int winMemS
30a0: 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74  ize(void *p);.st
30b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52  atic int winMemR
30c0: 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73  oundup(int n);.s
30d0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
30e0: 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44  Init(void *pAppD
30f0: 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ata);.static voi
3100: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
3110: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
3120: 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ;..const sqlite3
3130: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
3140: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
3150: 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f  (void);.#endif /
3160: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
3170: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
3180: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
3190: 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61  riable is (norma
31a0: 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e  lly) set once an
31b0: 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a  d never changes.
31c0: 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20  ** thereafter.  
31d0: 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68  It records wheth
31e0: 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  er the operating
31f0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78   system is Win9x
3200: 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a  .** or WinNT..**
3210: 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69  .** 0:   Operati
3220: 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77  ng system unknow
3230: 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61  n..** 1:   Opera
3240: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3250: 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70  in9x..** 2:   Op
3260: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
3270: 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49  s WinNT..**.** I
3280: 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c  n order to facil
3290: 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e  itate testing on
32a0: 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c   a WinNT system,
32b0: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
32c0: 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c  e.** can manuall
32d0: 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65  y set this value
32e0: 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65   to 1 to emulate
32f0: 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e   Win98 behavior.
3300: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3310: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
3320: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
3330: 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  #elif !SQLITE_OS
3340: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
3350: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a  E_OS_WINRT && \.
3360: 20 20 20 20 20 20 64 65 66 69 6e 65 64 28 53 51        defined(SQ
3370: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
3380: 4e 53 49 29 20 26 26 20 64 65 66 69 6e 65 64 28  NSI) && defined(
3390: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
33a0: 5f 57 49 44 45 29 0a 73 74 61 74 69 63 20 69 6e  _WIDE).static in
33b0: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
33c0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
33d0: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
33e0: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
33f0: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3400: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
3410: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3420: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
3430: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
3440: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
3450: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3460: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
3470: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
3480: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
3490: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
34a0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
34b0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
34c0: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
34d0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
34e0: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
34f0: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
3500: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
3510: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
3520: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
3530: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
3540: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
3550: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
3560: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
3570: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
3580: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
3590: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
35a0: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
35b0: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
35c0: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
35d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
35e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35f0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3600: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3610: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
3620: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
3630: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
3640: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
3650: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3660: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
3670: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
3680: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
3690: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
36a0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
36b0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
36c0: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
36d0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
36e0: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
36f0: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
3700: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
3710: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
3720: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3730: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3740: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3750: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
3760: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
3770: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
3780: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
3790: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
37a0: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
37b0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
37c0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
37d0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
37e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
37f0: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
3800: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
3810: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
3820: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
3830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3840: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
3850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3860: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3890: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
38a0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
38b0: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
38c0: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
38d0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
38e0: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
38f0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3900: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3910: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
3920: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3930: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
3940: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3950: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
3960: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3970: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
39a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
39b0: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
39c0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
39d0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
39e0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
39f0: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
3a00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3a10: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
3a20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3a30: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
3a40: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
3a50: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
3a60: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3a70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3a80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a90: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
3aa0: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3ab0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3ac0: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
3ad0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3ae0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3af0: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3b00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3b30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3b40: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
3b50: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
3b60: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
3b70: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
3b80: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
3b90: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
3ba0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
3bb0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3bc0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3bd0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3be0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3bf0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3c00: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3c10: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
3c20: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
3c30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3c40: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3c80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3c90: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
3ca0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3cb0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
3cc0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3cd0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3ce0: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3cf0: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3d00: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
3d10: 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f  )..#if (!SQLITE_
3d20: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3d30: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3d40: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
3d50: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
3d60: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
3d70: 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )).  { "CreateFi
3d80: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
3d90: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
3da0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20  eFileMappingA,  
3db0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3dc0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
3dd0: 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  ppingA",      (S
3de0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3e10: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
3e20: 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44  eMappingA ((HAND
3e30: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
3e40: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
3e50: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
3e60: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
3e70: 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53  DWORD,LPCSTR))aS
3e80: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
3e90: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3ea0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
3eb0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3ec0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3ed0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
3ee0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
3ef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3f00: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
3f10: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3f20: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3f30: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3f40: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
3f50: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3f60: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
3f70: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3fa0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3fb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28  teFileMappingW (
3fc0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3fd0: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
3fe0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3ff0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
4000: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53  WORD,DWORD,LPCWS
4010: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  TR))aSyscall[7].
4020: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4030: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4040: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4050: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4060: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  ).  { "CreateMut
4070: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
4080: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
4090: 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20  MutexW,         
40a0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
40b0: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
40c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
40d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
40e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
40f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4100: 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65  ine osCreateMute
4110: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
4120: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
4130: 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c  ATTRIBUTES,BOOL,
4140: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53   \.        LPCWS
4150: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
4160: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4170: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4180: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4190: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
41b0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
41c0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
41d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
41e0: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
41f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4200: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4210: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4220: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4230: 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28  osDeleteFileA ((
4240: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4250: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39  CSTR))aSyscall[9
4260: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4270: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4280: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4290: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
42a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
42b0: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
42c0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
42d0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
42e0: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
42f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4300: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4320: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4330: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20  e osDeleteFileW 
4340: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4350: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4360: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
4370: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4380: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4390: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
43a0: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c  e", (SYSCALL)Fil
43b0: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
43c0: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
43d0: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
43e0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
43f0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4410: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4420: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
4430: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4440: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4450: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4460: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
4470: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
4480: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
4490: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
44a0: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
44b0: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
44c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65     (SYSCALL)File
44d0: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
44e0: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
44f0: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
4500: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
4510: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4540: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
4550: 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42  ToSystemTime ((B
4560: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
4570: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
4580: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
4590: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
45a0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
45b0: 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66  { "FlushFileBuff
45c0: 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59  ers",        (SY
45d0: 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42  SCALL)FlushFileB
45e0: 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30  uffers,        0
45f0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
4600: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20  lushFileBuffers 
4610: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4620: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
4630: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
4640: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4650: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4660: 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  I).  { "FormatMe
4670: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
4680: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4690: 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20  tMessageA,      
46a0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
46b0: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
46c0: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
46d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4700: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
4710: 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49  sageA ((DWORD(WI
4720: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
4730: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
4740: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
4750: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
4760: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
4770: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4790: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
47a0: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
47b0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
47c0: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
47d0: 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  geW,          0 
47e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
47f0: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
4800: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4810: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4820: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4830: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4840: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20  sFormatMessageW 
4850: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4860: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
4870: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WORD,DWORD,LPWST
4880: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
4890: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
48a0: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
48b0: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
48c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
48d0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
48e0: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4900: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
4910: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
4920: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4930: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
4940: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4950: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4960: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4970: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4980: 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28  osFreeLibrary ((
4990: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d  BOOL(WINAPI*)(HM
49a0: 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ODULE))aSyscall[
49b0: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
49c0: 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72   { "GetCurrentPr
49d0: 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53  ocessId",     (S
49e0: 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e  YSCALL)GetCurren
49f0: 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20  tProcessId,     
4a00: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
4a10: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
4a20: 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41  sId ((DWORD(WINA
4a30: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4a40: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
4a50: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4a60: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
4a70: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4a80: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
4a90: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4aa0: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4ab0: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4ac0: 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceA,       0 },.
4ad0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4ae0: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
4af0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4b20: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4b30: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20  tDiskFreeSpaceA 
4b40: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4b50: 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  LPCSTR,LPDWORD,L
4b60: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
4b70: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
4b80: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  D))aSyscall[18].
4b90: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4ba0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4bb0: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
4bc0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4bd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4be0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69  WIDE).  { "GetDi
4bf0: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4c00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4c10: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c  tDiskFreeSpaceW,
4c20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4c30: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
4c40: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
4c50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4c80: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
4c90: 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f  kFreeSpaceW ((BO
4ca0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
4cb0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
4cc0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
4cd0: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
4ce0: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
4cf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4d00: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4d10: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4d20: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4d30: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4d40: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4d50: 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c  utesA,      0 },
4d60: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4d70: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
4d80: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4da0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4db0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4dc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4dd0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
4de0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
4df0: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
4e00: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4e10: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4e20: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4e30: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4e40: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4e50: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4e60: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4e70: 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesW,      0 },.
4e80: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4e90: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
4ea0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ed0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ee0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4ef0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4f00: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
4f10: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
4f20: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4f30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4f40: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
4f50: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4f60: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65  ,    (SYSCALL)Ge
4f70: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4f80: 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  xW,    0 },.#els
4f90: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
4fa0: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
4fb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4fe0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
4ff0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28  eAttributesExW (
5000: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
5010: 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45  PCWSTR,GET_FILEE
5020: 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c  X_INFO_LEVELS, \
5030: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
5040: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
5050: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5060: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5070: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5090: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
50a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
50b0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
50c0: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
50d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
50e0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
50f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5100: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5110: 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28  osGetFileSize ((
5120: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
5130: 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61  ANDLE,LPDWORD))a
5140: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
5150: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5160: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
5170: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5180: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5190: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
51a0: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
51b0: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
51c0: 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30  hNameA,        0
51d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
51e0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
51f0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
5200: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5210: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5220: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5230: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
5240: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
5250: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
5260: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
5270: 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61    LPSTR*))aSysca
5280: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
5290: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
52a0: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
52b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
52c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
52d0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
52e0: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
52f0: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
5300: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
5310: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
5320: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5330: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
5340: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5350: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5360: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5370: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5380: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
5390: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
53a0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
53b0: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
53c0: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
53d0: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
53e0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
53f0: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
5400: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
5410: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
5420: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5430: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
5440: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
5450: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5460: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
5470: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5480: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5490: 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51  XTENSION).#if SQ
54a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
54b0: 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64  /* The GetProcAd
54c0: 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65  dressA() routine
54d0: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
54e0: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
54f0: 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  . */.  { "GetPro
5500: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5510: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5520: 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20  ProcAddressA,   
5530: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5540: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
5550: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
5560: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
5570: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
5580: 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73  e.  ** an ANSI s
5590: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
55a0: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
55b0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20   setting */.  { 
55c0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
55d0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
55e0: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
55f0: 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ss,          0 }
5600: 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20  ,.#endif.#else. 
5610: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
5620: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
5630: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5660: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64  fine osGetProcAd
5670: 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43  dressA ((FARPROC
5680: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
5690: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  E, \.        LPC
56a0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  STR))aSyscall[27
56b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
56c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
56d0: 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  T.  { "GetSystem
56e0: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
56f0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
5700: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  temInfo,        
5710: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5720: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
5730: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5740: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5760: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5770: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
5780: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
5790: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
57a0: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
57b0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
57c0: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
57d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
57e0: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
57f0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
5800: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5810: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
5820: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
5830: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
5840: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
5850: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5860: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
5870: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5880: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
5890: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
58a0: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
58b0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
58c0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
58d0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5900: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
5910: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
5920: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
5930: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
5940: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
5950: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
5960: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5970: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
5980: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
5990: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
59a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
59b0: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
59c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
59d0: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
59e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
59f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5a20: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
5a30: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
5a40: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
5a50: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
5a60: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5a80: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5a90: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5aa0: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5ab0: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5ac0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
5ad0: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
5ae0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5af0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5b10: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5b30: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5b40: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
5b50: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
5b60: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
5b70: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
5b80: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5b90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5ba0: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5bb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5bc0: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
5bd0: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
5be0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5bf0: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
5c00: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5c10: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5c20: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5c30: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5c40: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
5c50: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5c60: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
5c70: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
5c80: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5c90: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5ca0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5cb0: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
5cc0: 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20 20  IONEX) && \.    
5cd0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
5ce0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
5cf0: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5d00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d10: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
5d20: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
5d30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5d40: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
5d50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5d60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5d70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5d80: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5d90: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
5da0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5db0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
5dc0: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
5dd0: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
5de0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5df0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5e00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5e10: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
5e20: 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 64  .        defined
5e30: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
5e40: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53  TVERSIONEX) && S
5e50: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5e60: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
5e70: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5e80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e90: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
5ea0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5eb0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
5ec0: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
5ed0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5f00: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5f10: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
5f20: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
5f30: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
5f40: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
5f50: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
5f60: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5f80: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
5f90: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5fa0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5fb0: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
5fc0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5fd0: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5fe0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
5ff0: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
6000: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6010: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6020: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
6030: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6040: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
6050: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6060: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6070: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6080: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
60b0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
60c0: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
60d0: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
60e0: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
60f0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
6100: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
6110: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6120: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
6130: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
6140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6150: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6170: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6180: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6190: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
61c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
61d0: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
61e0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
61f0: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
6200: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
6210: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
6220: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6230: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
6240: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6250: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6260: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6270: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6280: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6290: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
62a0: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
62b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
62c0: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
62d0: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
62e0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
62f0: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
6300: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
6310: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
6320: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6330: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
6340: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6350: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6360: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6370: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6390: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
63a0: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
63b0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
63c0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
63d0: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
63e0: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
63f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6400: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
6410: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
6420: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6430: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
6440: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6450: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6460: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6470: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
64a0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
64b0: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
64c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
64d0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
64e0: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
64f0: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
6500: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
6510: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
6520: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6530: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
6540: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6550: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6560: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6570: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6580: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6590: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
65c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
65d0: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
65e0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
65f0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
6600: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
6610: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6620: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
6630: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
6640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
6650: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6660: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6670: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6680: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6690: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
66a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
66b0: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
66c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
66d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
66f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6700: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
6710: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6720: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
6730: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
6740: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6750: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6760: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6770: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6780: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6790: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
67a0: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
67b0: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
67c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
67d0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
67e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
67f0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6800: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
6810: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6840: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6850: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6860: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6870: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6880: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6890: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
68a0: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
68b0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
68c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
68d0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
68e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
68f0: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6910: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6930: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6940: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
6950: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6960: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6970: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6980: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6990: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
69a0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
69b0: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
69c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
69d0: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
69f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6a00: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6a10: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a30: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a40: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6a50: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6a60: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6a70: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6a80: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6a90: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6aa0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6ab0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6ac0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6ad0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6ae0: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6af0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6b00: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6b10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6b20: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6b30: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6b40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6b70: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6b80: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6b90: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6ba0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6bb0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6bc0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6bd0: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6be0: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6bf0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6c00: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6c10: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6c20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6c30: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6c40: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
6c50: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
6c60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6c70: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
6c80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
6c90: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
6ca0: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6cb0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6cc0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6cd0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6ce0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6cf0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  MapViewOfFile ((
6d00: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
6d10: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
6d20: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
6d30: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6d40: 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e  call[49].pCurren
6d50: 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79  t)..  { "MultiBy
6d60: 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20  teToWideChar",  
6d70: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74     (SYSCALL)Mult
6d80: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c  iByteToWideChar,
6d90: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6da0: 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f  ne osMultiByteTo
6db0: 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57  WideChar ((int(W
6dc0: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
6dd0: 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50  RD,LPCSTR,int,LP
6de0: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
6df0: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30  int))aSyscall[50
6e00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6e10: 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e   "QueryPerforman
6e20: 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53  ceCounter", (SYS
6e30: 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72  CALL)QueryPerfor
6e40: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20  manceCounter, 0 
6e50: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75  },..#define osQu
6e60: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
6e70: 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e  unter ((BOOL(WIN
6e80: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6e90: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29   LARGE_INTEGER*)
6ea0: 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43  )aSyscall[51].pC
6eb0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65  urrent)..  { "Re
6ec0: 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  adFile",        
6ed0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6ee0: 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20  )ReadFile,      
6ef0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6f00: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69  #define osReadFi
6f10: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6f20: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44  *)(HANDLE,LPVOID
6f30: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
6f40: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
6f50: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
6f60: 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [52].pCurrent)..
6f70: 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c    { "SetEndOfFil
6f80: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
6f90: 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66  SYSCALL)SetEndOf
6fa0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6fb0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6fc0: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28  sSetEndOfFile ((
6fd0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6fe0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
6ff0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
7000: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7010: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
7020: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
7030: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
7040: 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20  lePointer,      
7050: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7060: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
7070: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
7080: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
70b0: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
70c0: 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49  inter ((DWORD(WI
70d0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f  NAPI*)(HANDLE,LO
70e0: 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20  NG,PLONG, \.    
70f0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
7100: 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74  all[54].pCurrent
7110: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
7120: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65  S_WINRT.  { "Sle
7130: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
7140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7150: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
7160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7170: 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  lse.  { "Sleep",
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
71a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
71c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65  ..#define osSlee
71d0: 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  p ((VOID(WINAPI*
71e0: 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  )(DWORD))aSyscal
71f0: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
7200: 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65  .  { "SystemTime
7210: 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20  ToFileTime",    
7220: 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54  (SYSCALL)SystemT
7230: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20  imeToFileTime,  
7240: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7250: 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
7260: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
7270: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53  NAPI*)(CONST SYS
7280: 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  TEMTIME*, \.    
7290: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
72a0: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
72b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
72c0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
72d0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
72e0: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
72f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7300: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
7310: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
7320: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7330: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
7340: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7350: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7370: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
7380: 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a  ef osUnlockFile.
7390: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
73a0: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
73b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
73c0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
73d0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
73e0: 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75  aSyscall[57].pCu
73f0: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
7400: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7410: 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NCE.  { "UnlockF
7420: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
7430: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
7440: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
7450: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7460: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
7470: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
7480: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
74b0: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
74c0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
74d0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
74e0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
74f0: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
7500: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
7510: 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  58].pCurrent)..#
7520: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
7530: 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  CE || !defined(S
7540: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
7550: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7560: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7570: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7580: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7590: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
75a0: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
75b0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
75c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
75e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
75f0: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
7600: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
7610: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
7620: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
7630: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
7640: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
7650: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7660: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7670: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7680: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7690: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
76a0: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
76b0: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
76c0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
76d0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
76e0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
76f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7700: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
7710: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7720: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7740: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
7750: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7760: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7770: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7780: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7790: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
77a0: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
77b0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
77c0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
77d0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
77e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
77f0: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
7800: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7810: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7820: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
7830: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7850: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7860: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7870: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7880: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7890: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
78a0: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
78b0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
78c0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
78d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
78e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
78f0: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7900: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7910: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7920: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
7930: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7940: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7950: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7960: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7980: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7990: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
79a0: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
79b0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
79c0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
79d0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
79e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
79f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7a00: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
7a10: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
7a20: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
7a30: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
7a40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7a50: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7a60: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
7a70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7a90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7aa0: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
7ab0: 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44  ObjectEx ((DWORD
7ac0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7ad0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7ae0: 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c    BOOL))aSyscall
7af0: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
7b00: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7b10: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
7b20: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7b30: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
7b40: 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20  ilePointerEx,   
7b50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7b60: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7b70: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
7b80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7bb0: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
7bc0: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
7bd0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7be0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
7bf0: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
7c00: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
7c10: 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72  Syscall[65].pCur
7c20: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7c30: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7c40: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
7c50: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
7c60: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49  SYSCALL)GetFileI
7c70: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7c80: 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  leEx, 0 },.#else
7c90: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
7ca0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
7cb0: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  Ex", (SYSCALL)0,
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7ce0: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
7cf0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7d00: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
7d10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
7d20: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
7d30: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
7d40: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
7d50: 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75  aSyscall[66].pCu
7d60: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7d70: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
7d80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7d90: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61  MIT_WAL).  { "Ma
7da0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7db0: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
7dc0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  )MapViewOfFileFr
7dd0: 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23  omApp,    0 },.#
7de0: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
7df0: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
7e00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7e30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
7e40: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7e50: 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  p ((LPVOID(WINAP
7e60: 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47  I*)(HANDLE,ULONG
7e70: 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20  ,ULONG64, \.    
7e80: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
7e90: 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e  call[67].pCurren
7ea0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7eb0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
7ec0: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
7ed0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7ee0: 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20  CreateFile2,    
7ef0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7f00: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
7f10: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
7f20: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7f50: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
7f60: 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45  teFile2 ((HANDLE
7f70: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
7f80: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  R,DWORD,DWORD,DW
7f90: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7fa0: 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  PCREATEFILE2_EXT
7fb0: 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
7fc0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70  ))aSyscall[68].p
7fd0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7fe0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
7ff0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8000: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
8010: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50  SION).  { "LoadP
8020: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
8030: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
8040: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
8050: 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  y,     0 },.#els
8060: 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  e.  { "LoadPacka
8070: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
8080: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
80b0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61  #define osLoadPa
80c0: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28  ckagedLibrary ((
80d0: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
80e0: 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  (LPCWSTR, \.    
80f0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
8100: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
8110: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
8120: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
8130: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
8140: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
8150: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20  etTickCount64,  
8160: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8170: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
8180: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
8190: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
81c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
81d0: 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e  ckCount64 ((ULON
81e0: 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56  GLONG(WINAPI*)(V
81f0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  OID))aSyscall[70
8200: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8210: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
8220: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
8230: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
8240: 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69  (SYSCALL)GetNati
8250: 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  veSystemInfo,   
8260: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8270: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
8280: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
8290: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
82b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
82c0: 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79  ne osGetNativeSy
82d0: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
82e0: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
82f0: 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46      LPSYSTEM_INF
8300: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e  O))aSyscall[71].
8310: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
8320: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8330: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
8340: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
8350: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
8360: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
8370: 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30  gStringA,      0
8380: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
8390: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
83a0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
83b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
83c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
83d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
83e0: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
83f0: 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41  ingA ((VOID(WINA
8400: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
8410: 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65  scall[72].pCurre
8420: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
8430: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
8440: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74  S_WIDE).  { "Out
8450: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
8460: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8470: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8480: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
8490: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
84a0: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
84b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
84e0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
84f0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28  utDebugStringW (
8500: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
8510: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
8520: 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [73].pCurrent)..
8530: 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48    { "GetProcessH
8540: 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28  eap",          (
8550: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65  SYSCALL)GetProce
8560: 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20  ssHeap,         
8570: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
8580: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20  sGetProcessHeap 
8590: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
85a0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
85b0: 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [74].pCurrent)..
85c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
85d0: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
85e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
85f0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
8600: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c  MappingFromApp",
8610: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
8620: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
8630: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  pp, 0 },.#else. 
8640: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
8650: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
8660: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8690: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
86a0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20  eMappingFromApp 
86b0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
86c0: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
86d0: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
86e0: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c  TTRIBUTES,ULONG,
86f0: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29  ULONG64,LPCWSTR)
8700: 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43  )aSyscall[75].pC
8710: 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45  urrent)..}; /* E
8720: 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69  nd of the overri
8730: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
8740: 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  lls */../*.** Th
8750: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
8760: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
8770: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
8780: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
8790: 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65 73  ** "win32" VFSes
87a0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
87b0: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
87c0: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
87d0: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
87e0: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
87f0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
8800: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
8810: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
8820: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
8830: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
8840: 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d  int winSetSystem
8850: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
8860: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
8870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
8880: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
8890: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
88a0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
88b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
88c0: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
88d0: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
88e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
88f0: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
8900: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
8910: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
8920: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
8930: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
8940: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
8950: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
8960: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
8970: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
8980: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
8990: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
89a0: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
89b0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
89c0: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
89d0: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
89e0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
89f0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
8a00: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
8a10: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
8a20: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
8a30: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
8a40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
8a50: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8a60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
8a70: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
8a80: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
8a90: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
8aa0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
8ab0: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
8ac0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
8ad0: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
8ae0: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
8af0: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
8b00: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
8b10: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
8b20: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
8b30: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
8b40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
8b50: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
8b60: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
8b70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8b80: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
8b90: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
8ba0: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
8bb0: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
8bc0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
8bd0: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
8be0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
8bf0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
8c00: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
8c10: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
8c20: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
8c30: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
8c40: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
8c50: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
8c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8c70: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
8c80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8c90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
8ca0: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
8cb0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
8cc0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
8cd0: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
8ce0: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
8cf0: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
8d00: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
8d10: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
8d20: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
8d30: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
8d40: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
8d50: 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79  all_ptr winGetSy
8d60: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
8d70: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
8d80: 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d,.  const char 
8d90: 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69  *zName.){.  unsi
8da0: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55  gned int i;..  U
8db0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8dc0: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72  pNotUsed);.  for
8dd0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
8de0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
8df0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
8e00: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
8e10: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
8e20: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
8e30: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
8e40: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
8e50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8e60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
8e70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
8e80: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
8e90: 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49   after zName.  I
8ea0: 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a  f zName==NULL.**
8eb0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
8ec0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
8ed0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20  st 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 0a 2a 2a 20 69 73 20 74 68 65 20  zName.** is the 
8f00: 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  last system call
8f10: 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20   or if zName is 
8f20: 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  not the name of 
8f30: 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65  a valid.** syste
8f40: 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  m call..*/.stati
8f50: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69  c const char *wi
8f60: 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28  nNextSystemCall(
8f70: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20  sqlite3_vfs *p, 
8f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
8f90: 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31  e){.  int i = -1
8fa0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
8fb0: 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20  METER(p);.  if( 
8fc0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72  zName ){.    for
8fd0: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
8fe0: 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69  e(aSyscall)-1; i
8ff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9000: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
9010: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
9020: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
9030: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b  }.  }.  for(i++;
9040: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
9050: 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20  scall); i++){.  
9060: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
9070: 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20  ].pCurrent!=0 ) 
9080: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
9090: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20  i].zName;.  }.  
90a0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
90b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
90c0: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66  _MALLOC./*.** If
90d0: 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20   a Win32 native 
90e0: 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f  heap has been co
90f0: 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20 66  nfigured, this f
9100: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74  unction will att
9110: 65 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61  empt to.** compa
9120: 63 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63  ct it.  Upon suc
9130: 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  cess, SQLITE_OK 
9140: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
9150: 2e 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c  .  Upon failure,
9160: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54   one.** of SQLIT
9170: 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f  E_NOMEM, SQLITE_
9180: 45 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45  ERROR, or SQLITE
9190: 5f 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62  _NOTFOUND will b
91a0: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65  e returned.  The
91b0: 0a 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20  .** "pnLargest" 
91c0: 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e  argument, if non
91d0: 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75  -zero, will be u
91e0: 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68  sed to return th
91f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
9200: 20 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74   largest committ
9210: 65 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e  ed free block in
9220: 20 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79   the heap, in by
9230: 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  tes..*/.int sqli
9240: 74 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63  te3_win32_compac
9250: 74 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e  t_heap(LPUINT pn
9260: 4c 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20  Largest){.  int 
9270: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9280: 20 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20    UINT nLargest 
9290: 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48  = 0;.  HANDLE hH
92a0: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
92b0: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
92c0: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
92d0: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
92e0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
92f0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
9300: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
9310: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
9320: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
9330: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
9340: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
9350: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
9360: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
9370: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9380: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
9390: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  LL) );.#endif.#i
93a0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
93b0: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
93c0: 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c  _WINRT.  if( (nL
93d0: 61 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d  argest=osHeapCom
93e0: 70 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49  pact(hHeap, SQLI
93f0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9400: 41 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  AGS))==0 ){.    
9410: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
9420: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
9430: 28 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74  ();.    if( last
9440: 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20  Errno==NO_ERROR 
9450: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9460: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
9470: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
9480: 61 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70  apCompact (no sp
9490: 61 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  ace), heap=%p",.
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
94c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
94d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
94e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
94f0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
9500: 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ROR, "failed to 
9510: 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75  HeapCompact (%lu
9520: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
9540: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
9550: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
9560: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9570: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
9580: 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74   }.#else.  sqlit
9590: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
95a0: 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20  TFOUND, "failed 
95b0: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  to HeapCompact, 
95c0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
95d0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
95e0: 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51  Heap);.  rc = SQ
95f0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23  LITE_NOTFOUND;.#
9600: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61  endif.  if( pnLa
9610: 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65  rgest ) *pnLarge
9620: 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20  st = nLargest;. 
9630: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9640: 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20  *.** If a Win32 
9650: 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20  native heap has 
9660: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
9670: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
9680: 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a  ill attempt to.*
9690: 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  * destroy and re
96a0: 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74  create it.  If t
96b0: 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20  he Win32 native 
96c0: 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c  heap is not isol
96d0: 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74  ated and/or.** t
96e0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  he sqlite3_memor
96f0: 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f  y_used() functio
9700: 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72  n does not retur
9710: 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42  n zero, SQLITE_B
9720: 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72  USY will.** be r
9730: 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63  eturned and no c
9740: 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d  hanges will be m
9750: 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ade to the Win32
9760: 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f   native heap..*/
9770: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
9780: 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b  32_reset_heap(){
9790: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54  .  int rc;.  MUT
97a0: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
97b0: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
97c0: 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ; ) /* The main 
97d0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a  static mutex */.
97e0: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
97f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
9800: 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20  em; )    /* The 
9810: 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75  memsys static mu
9820: 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  tex */.  MUTEX_L
9830: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
9840: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
9850: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
9860: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
9870: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
9880: 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75  pMem = sqlite3Mu
9890: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
98a0: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
98b0: 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
98c0: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
98d0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  er);.  sqlite3_m
98e0: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29  utex_enter(pMem)
98f0: 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ;.  winMemAssert
9900: 4d 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77  Magic();.  if( w
9910: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
9920: 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65  NULL && winMemGe
9930: 74 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69  tOwned() && sqli
9940: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
9950: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  )==0 ){.    /*. 
9960: 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
9970: 69 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c  int, there shoul
9980: 64 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  d be no outstand
9990: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
99a0: 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a  ations on.    **
99b0: 20 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f   the heap.  Also
99c0: 2c 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65  , since both the
99d0: 20 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73   master and mems
99e0: 79 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72  ys locks are cur
99f0: 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65  rently.    ** be
9a00: 69 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20  ing held by us, 
9a10: 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  no other functio
9a20: 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f  n (i.e. from ano
9a30: 74 68 65 72 20 74 68 72 65 61 64 29 20 73 68 6f  ther thread) sho
9a40: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62  uld.    ** be ab
9a50: 6c 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73  le to even acces
9a60: 73 20 74 68 65 20 68 65 61 70 2e 20 20 41 74 74  s the heap.  Att
9a70: 65 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20  empt to destroy 
9a80: 61 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75 72  and recreate our
9a90: 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64  .    ** isolated
9aa0: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9ab0: 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  ap now..    */. 
9ac0: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
9ad0: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
9ae0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9af0: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
9b00: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9b10: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9b20: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
9b30: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77  winMemShutdown(w
9b40: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
9b50: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
9b60: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d  winMemGetHeap()=
9b70: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73  =NULL );.    ass
9b80: 65 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f  ert( !winMemGetO
9b90: 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73  wned() );.    as
9ba0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65  sert( sqlite3_me
9bb0: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
9bc0: 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65  ;.    rc = winMe
9bd0: 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44  mInit(winMemGetD
9be0: 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61  ataPtr());.    a
9bf0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
9c00: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
9c10: 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b  tHeap()!=NULL );
9c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
9c30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69  =SQLITE_OK || wi
9c40: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
9c50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
9c60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
9c70: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
9c80: 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  ed()==0 );.  }el
9c90: 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  se{.    /*.    *
9ca0: 2a 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69  * The Win32 nati
9cb0: 76 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62  ve heap cannot b
9cc0: 65 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75  e modified becau
9cd0: 73 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  se it may be in 
9ce0: 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
9cf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
9d00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
9d10: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d  mutex_leave(pMem
9d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
9d30: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
9d40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9d50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
9d60: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
9d70: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
9d80: 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20  unction outputs 
9d90: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41  the specified (A
9da0: 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74  NSI) string to t
9db0: 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65  he Win32 debugge
9dc0: 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62  r.** (if availab
9dd0: 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71  le)..*/..void sq
9de0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74  lite3_win32_writ
9df0: 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68  e_debug(const ch
9e00: 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42  ar *zBuf, int nB
9e10: 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67  uf){.  char zDbg
9e20: 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32  Buf[SQLITE_WIN32
9e30: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a  _DBG_BUF_SIZE];.
9e40: 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
9e50: 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57  (nBuf, (SQLITE_W
9e60: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
9e70: 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20  E - 1)); /* may 
9e80: 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a  be negative. */.
9e90: 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20    if( nMin<-1 ) 
9ea0: 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c  nMin = -1; /* al
9eb0: 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  l negative value
9ec0: 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a  s become -1. */.
9ed0: 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d    assert( nMin==
9ee0: 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c  -1 || nMin==0 ||
9ef0: 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e   nMin<SQLITE_WIN
9f00: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
9f10: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
9f20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
9f30: 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e  ANSI).  if( nMin
9f40: 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  >0 ){.    memset
9f50: 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c  (zDbgBuf, 0, SQL
9f60: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
9f70: 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d  F_SIZE);.    mem
9f80: 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75  cpy(zDbgBuf, zBu
9f90: 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73  f, nMin);.    os
9fa0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
9fb0: 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  gA(zDbgBuf);.  }
9fc0: 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70  else{.    osOutp
9fd0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a  utDebugStringA(z
9fe0: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20  Buf);.  }.#elif 
9ff0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
a000: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
a010: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
a020: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
a030: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
a040: 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79    if ( osMultiBy
a050: 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20  teToWideChar(.  
a060: 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c          osAreFil
a070: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
a080: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c  _ACP : CP_OEMCP,
a090: 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20   0, zBuf,.      
a0a0: 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54      nMin, (LPWST
a0b0: 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54  R)zDbgBuf, SQLIT
a0c0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a0d0: 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41  SIZE/sizeof(WCHA
a0e0: 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  R))<=0 ){.    re
a0f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75  turn;.  }.  osOu
a100: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
a110: 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75  ((LPCWSTR)zDbgBu
a120: 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
a130: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
a140: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
a150: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
a160: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
a170: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
a180: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
a190: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
a1a0: 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29  , "%s", zDbgBuf)
a1b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
a1c0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
a1d0: 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  %s", zBuf);.  }.
a1e0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
a1f0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
a200: 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74  utine suspends t
a210: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
a220: 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d  d for at least m
a230: 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s.** millisecond
a240: 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75 69  s.  This is equi
a250: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69  valent to the Wi
a260: 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65  n32 Sleep() inte
a270: 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51  rface..*/.#if SQ
a280: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74  LITE_OS_WINRT.st
a290: 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65  atic HANDLE slee
a2a0: 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e  pObj = NULL;.#en
a2b0: 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  dif..void sqlite
a2c0: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57  3_win32_sleep(DW
a2d0: 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  ORD milliseconds
a2e0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
a2f0: 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c  _WINRT.  if ( sl
a300: 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a  eepObj==NULL ){.
a310: 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f      sleepObj = o
a320: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 28  sCreateEventExW(
a330: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41  NULL, NULL, CREA
a340: 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f  TE_EVENT_MANUAL_
a350: 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20  RESET,.         
a360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a370: 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49         SYNCHRONI
a380: 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ZE);.  }.  asser
a390: 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  t( sleepObj!=NUL
a3a0: 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72  L );.  osWaitFor
a3b0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73  SingleObjectEx(s
a3c0: 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65  leepObj, millise
a3d0: 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23  conds, FALSE);.#
a3e0: 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d  else.  osSleep(m
a3f0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65  illiseconds);.#e
a400: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
a410: 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a  turn true (non-z
a420: 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72  ero) if we are r
a430: 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e  unning under Win
a440: 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50  NT, Win2K, WinXP
a450: 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20  ,.** or WinCE.  
a460: 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65  Return false (ze
a470: 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57  ro) for Win95, W
a480: 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a  in98, or WinME..
a490: 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e  **.** Here is an
a4a0: 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73   interesting obs
a4b0: 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35  ervation:  Win95
a4c0: 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e  , Win98, and Win
a4d0: 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c  ME lack.** the L
a4e0: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
a4f0: 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69    But we can sti
a500: 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  ll statically li
a510: 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a  nk against that.
a520: 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61  ** API as long a
a530: 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20  s we don't call 
a540: 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  it when running 
a550: 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20  Win95/98/ME.  A 
a560: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20  call to.** this 
a570: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
a580: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
a590: 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39  the host is Win9
a5a0: 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69  5/98/ME or.** Wi
a5b0: 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61  nNT/2K/XP so tha
a5c0: 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  t we will know w
a5d0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65  hether or not we
a5e0: 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c   can safely call
a5f0: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
a600: 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69  Ex() API..*/..#i
a610: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
a620: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
a630: 4f 4e 45 58 29 20 7c 7c 20 21 53 51 4c 49 54 45  ONEX) || !SQLITE
a640: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
a650: 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  NEX.# define osI
a660: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
a670: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
a680: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
a690: 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NRT || !defined(
a6a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
a6b0: 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20  _ANSI).# define 
a6c0: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65  osIsNT()  (1).#e
a6d0: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  lif !defined(SQL
a6e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
a6f0: 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  DE).# define osI
a700: 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65  sNT()  (0).#else
a710: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f 73  .  static int os
a720: 49 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20  IsNT(void){.    
a730: 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  if( sqlite3_os_t
a740: 79 70 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  ype==0 ){.#if de
a750: 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45 52 53  fined(NTDDI_VERS
a760: 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f 56 45  ION) && NTDDI_VE
a770: 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49 5f 57  RSION >= NTDDI_W
a780: 49 4e 38 0a 20 20 20 20 20 20 4f 53 56 45 52 53  IN8.      OSVERS
a790: 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a  IONINFOW sInfo;.
a7a0: 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53        sInfo.dwOS
a7b0: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
a7c0: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
a7d0: 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73  .      osGetVers
a7e0: 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a  ionExW(&sInfo);.
a7f0: 23 65 6c 73 65 0a 20 20 20 20 20 20 4f 53 56 45  #else.      OSVE
a800: 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f  RSIONINFOA sInfo
a810: 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e 64 77  ;.      sInfo.dw
a820: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
a830: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
a840: 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74 56 65  );.      osGetVe
a850: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29  rsionExA(&sInfo)
a860: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73  ;.#endif.      s
a870: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
a880: 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72   sInfo.dwPlatfor
a890: 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52  mId==VER_PLATFOR
a8a0: 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a  M_WIN32_NT ? 2 :
a8b0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
a8c0: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f  turn sqlite3_os_
a8d0: 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e  type==2;.  }.#en
a8e0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
a8f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
a900: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
a910: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e  Bytes of memory.
a920: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a930: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
a940: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
a950: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
a960: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
a970: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
a980: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
a990: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
a9a0: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
a9b0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
a9c0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
a9d0: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
a9e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
a9f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
aa00: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
aa10: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
aa20: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
aa30: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
aa40: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
aa50: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
aa60: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
aa70: 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65  =0 );.  p = osHe
aa80: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
aa90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
aaa0: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
aab0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21  nBytes);.  if( !
aac0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
aad0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
aae0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
aaf0: 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73  apAlloc %u bytes
ab00: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
ab10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ab20: 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c    nBytes, osGetL
ab30: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
ab40: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
ab50: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
ab60: 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e  .** Free memory.
ab70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ab80: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
ab90: 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44  *pPrior){.  HAND
aba0: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
abb0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
abc0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
abd0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
abe0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
abf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
ac00: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
ac10: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
ac20: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
ac30: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ac40: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
ac50: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
ac60: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
ac70: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
ac80: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
ac90: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
aca0: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69  ndif.  if( !pPri
acb0: 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  or ) return; /* 
acc0: 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20  Passing NULL to 
acd0: 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65  HeapFree is unde
ace0: 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  fined. */.  if( 
acf0: 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61  !osHeapFree(hHea
ad00: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
ad10: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
ad20: 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  or) ){.    sqlit
ad30: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
ad40: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
ad50: 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25  HeapFree block %
ad60: 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  p (%lu), heap=%p
ad70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ad80: 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74     pPrior, osGet
ad90: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
ada0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
adb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
adc0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  the size of an e
add0: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61  xisting memory a
ade0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
adf0: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
ae00: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50  Realloc(void *pP
ae10: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73  rior, int nBytes
ae20: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
ae30: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
ae40: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
ae50: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
ae60: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
ae70: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
ae80: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ae90: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
aea0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
aeb0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
aec0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
aed0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
aee0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
aef0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
af00: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
af10: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
af20: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
af30: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
af40: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
af50: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
af60: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
af70: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
af80: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
af90: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
afa0: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
afb0: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
afc0: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
afd0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
afe0: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
aff0: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
b000: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
b010: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b020: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
b030: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
b040: 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  es (%lu), heap=%
b050: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
b060: 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65      pPrior ? "He
b070: 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65  apReAlloc" : "He
b080: 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73  apAlloc", nBytes
b090: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
b0a0: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
b0b0: 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70      (void*)hHeap
b0c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b0d0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
b0e0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
b0f0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c  n outstanding al
b100: 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74  location, in byt
b110: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
b120: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
b130: 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20  d *p){.  HANDLE 
b140: 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20  hHeap;.  SIZE_T 
b150: 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  n;..  winMemAsse
b160: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
b170: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
b180: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
b190: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
b1a0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
b1b0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
b1c0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
b1d0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
b1e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b1f0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
b200: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
b210: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
b220: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
b230: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29  HEAP_FLAGS, p) )
b240: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
b250: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
b260: 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68  n = osHeapSize(h
b270: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
b280: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
b290: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a  );.  if( n==(SIZ
b2a0: 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71  E_T)-1 ){.    sq
b2b0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b2c0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
b2d0: 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63  to HeapSize bloc
b2e0: 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70  k %p (%lu), heap
b2f0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
b300: 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61        p, osGetLa
b310: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
b320: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65  *)hHeap);.    re
b330: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
b340: 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a  turn (int)n;.}..
b350: 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61  /*.** Round up a
b360: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f   request size to
b370: 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20   the next valid 
b380: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e  allocation size.
b390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b3a0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
b3b0: 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b   n){.  return n;
b3c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
b3d0: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
b3e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b3f0: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
b400: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
b410: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
b420: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
b430: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
b440: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
b450: 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ata ) return SQL
b460: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73  ITE_ERROR;.  ass
b470: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
b480: 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  ->magic1==WINMEM
b490: 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73  _MAGIC1 );.  ass
b4a0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
b4b0: 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  ->magic2==WINMEM
b4c0: 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20  _MAGIC2 );..#if 
b4d0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
b4e0: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
b4f0: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69  _HEAP_CREATE.  i
b500: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
b510: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57  >hHeap ){.    DW
b520: 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  ORD dwInitialSiz
b530: 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  e = SQLITE_WIN32
b540: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b  _HEAP_INIT_SIZE;
b550: 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78  .    DWORD dwMax
b560: 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52  imumSize = (DWOR
b570: 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  D)sqlite3GlobalC
b580: 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20  onfig.nHeap;.   
b590: 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69   if( dwMaximumSi
b5a0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ze==0 ){.      d
b5b0: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53  wMaximumSize = S
b5c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b5d0: 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  _MAX_SIZE;.    }
b5e0: 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74 69  else if( dwIniti
b5f0: 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d  alSize>dwMaximum
b600: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77  Size ){.      dw
b610: 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77  InitialSize = dw
b620: 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20  MaximumSize;.   
b630: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
b640: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65  ta->hHeap = osHe
b650: 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f  apCreate(SQLITE_
b660: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
b670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 20 20 20 20 20 20 64 77 49 6e 69 74 69 61          dwInitia
b6a0: 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d  lSize, dwMaximum
b6b0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
b6c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
b6d0: 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ap ){.      sqli
b6e0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
b6f0: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20  OMEM,.          
b700: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
b710: 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61  reate (%lu), fla
b720: 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d  gs=%u, initSize=
b730: 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75  %lu, maxSize=%lu
b740: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47  ",.          osG
b750: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53  etLastError(), S
b760: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b770: 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61  _FLAGS, dwInitia
b780: 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  lSize,.         
b790: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b   dwMaximumSize);
b7a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b7b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b7c0: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
b7d0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45  a->bOwned = TRUE
b7e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
b7f0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
b800: 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  d );.  }.#else. 
b810: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
b820: 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65  eap = osGetProce
b830: 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20  ssHeap();.  if( 
b840: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
b850: 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eap ){.    sqlit
b860: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
b870: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61  MEM,.        "fa
b880: 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65  iled to GetProce
b890: 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f  ssHeap (%lu)", o
b8a0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
b8b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b8c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
b8d0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
b8e0: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
b8f0: 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d  assert( !pWinMem
b900: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
b910: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
b920: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
b930: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
b940: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
b950: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
b960: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
b970: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b980: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
b990: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
b9a0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
b9b0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
b9c0: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
b9d0: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
b9e0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b9f0: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
ba00: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
ba10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ba20: 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   Deinitialize th
ba30: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
ba40: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
ba50: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70  Shutdown(void *p
ba60: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
ba70: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
ba80: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
ba90: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
baa0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
bab0: 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  a ) return;.  as
bac0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bad0: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
bae0: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
baf0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
bb00: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
bb10: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20 69  M_MAGIC2 );..  i
bb20: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
bb30: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73  hHeap ){.    ass
bb40: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
bb50: 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ->hHeap!=INVALID
bb60: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bb70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bb80: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bb90: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bba0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
bbb0: 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61     assert( osHea
bbc0: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
bbd0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
bbe0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
bbf0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
bc00: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
bc10: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
bc20: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ed ){.      if( 
bc30: 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70  !osHeapDestroy(p
bc40: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
bc50: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  p) ){.        sq
bc60: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
bc70: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
bc80: 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28  to HeapDestroy (
bc90: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
bcc0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69  or(), (void*)pWi
bcd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
bce0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bcf0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
bd00: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ned = FALSE;.   
bd10: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
bd20: 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c  ta->hHeap = NULL
bd30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
bd40: 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d  opulate the low-
bd50: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
bd60: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
bd70: 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20   pointers in.** 
bd80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
bd90: 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74  fig.m with point
bda0: 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69  ers to the routi
bdb0: 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
bdc0: 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  . The.** argumen
bdd0: 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62  ts specify the b
bde0: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
bdf0: 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o manage..**.** 
be00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
be10: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
be20: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c  qlite3_config(),
be30: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a   and therefore.*
be40: 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
be50: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
be60: 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a  fe (it is not)..
be70: 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
be80: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
be90: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
bea0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
beb0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
bec0: 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65  em_methods winMe
bed0: 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  mMethods = {.   
bee0: 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20   winMemMalloc,. 
bef0: 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20     winMemFree,. 
bf00: 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63     winMemRealloc
bf10: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65  ,.    winMemSize
bf20: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e  ,.    winMemRoun
bf30: 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49  dup,.    winMemI
bf40: 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  nit,.    winMemS
bf50: 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69  hutdown,.    &wi
bf60: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a  n_mem_data.  };.
bf70: 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d    return &winMem
bf80: 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64  Methods;.}..void
bf90: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
bfa0: 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73  fault(void){.  s
bfb0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
bfc0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
bfd0: 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65  OC, sqlite3MemGe
bfe0: 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e  tWin32());.}.#en
bff0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
c000: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
c010: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
c020: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d  TF-8 string to M
c030: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
c040: 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a   (UTF-16?). .**.
c050: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
c060: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
c070: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
c080: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f   from malloc..*/
c090: 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77  .static LPWSTR w
c0a0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
c0b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
c0c0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
c0d0: 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
c0e0: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
c0f0: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
c100: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
c110: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
c120: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
c130: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
c140: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c150: 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69  0;.  }.  zWideFi
c160: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
c170: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61  MallocZero( nCha
c180: 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
c190: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
c1a0: 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
c1b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
c1c0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  rn 0;.  }.  nCha
c1d0: 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  r = osMultiByteT
c1e0: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
c1f0: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
c200: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
c210: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c230: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
c240: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
c250: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
c260: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
c270: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
c280: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
c290: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
c2a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
c2b0: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
c2c0: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
c2d0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
c2e0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
c2f0: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
c300: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
c310: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
c320: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
c330: 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52  deToUtf8(LPCWSTR
c340: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
c350: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
c360: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
c370: 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  ..  nByte = osWi
c380: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
c390: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
c3a0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
c3b0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
c3c0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
c3d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c3e0: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
c3f0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
c400: 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  ero( nByte );.  
c410: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
c420: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c430: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
c440: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
c450: 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30  iByte(CP_UTF8, 0
c460: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
c470: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
c480: 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20         0, 0);.  
c4b0: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
c4c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c4d0: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
c4e0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
c4f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
c500: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
c510: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e  ** Convert an AN
c520: 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63  SI string to Mic
c530: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20  rosoft Unicode, 
c540: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
c550: 63 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65  current codepage
c560: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69   settings for fi
c570: 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20  le apis..** .** 
c580: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
c590: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
c5a0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  g is obtained.**
c5b0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
c5c0: 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lloc..*/.static 
c5d0: 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f  LPWSTR winMbcsTo
c5e0: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
c5f0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
c600: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
c610: 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e  PWSTR zMbcsFilen
c620: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
c630: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
c640: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
c650: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
c660: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
c670: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
c680: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
c690: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
c6a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
c6d0: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
c6e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c6f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46   0;.  }.  zMbcsF
c700: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
c710: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
c720: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
c730: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
c740: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
c750: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
c760: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
c770: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
c780: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
c790: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
c7a0: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
c7b0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
c7e0: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
c7f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c800: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
c810: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
c820: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
c830: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
c840: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
c850: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
c860: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
c870: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
c880: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
c890: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
c8a0: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
c8b0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
c8c0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
c8d0: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
c8e0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
c8f0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
c900: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e  atic char *winUn
c910: 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57  icodeToMbcs(LPCW
c920: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
c930: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
c940: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
c950: 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  me;.  int codepa
c960: 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70  ge = osAreFileAp
c970: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
c980: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
c990: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
c9a0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
c9b0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
c9c0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
c9d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
c9e0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
c9f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ca00: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
ca10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
ca20: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
ca30: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
ca40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ca50: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
ca60: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
ca70: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
ca80: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
ca90: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  -1, zFilename,. 
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 20 20 20 20 6e                 n
cac0: 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Byte, 0, 0);.  i
cad0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
cae0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
caf0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
cb00: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
cb10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
cb20: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
cb30: 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62  * Convert multib
cb40: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
cb50: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20  ring to UTF-8.  
cb60: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
cb70: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74  e.** returned st
cb80: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
cb90: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
cba0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20  lloc()..*/.char 
cbb0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d  *sqlite3_win32_m
cbc0: 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73  bcs_to_utf8(cons
cbd0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
cbe0: 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  e){.  char *zFil
cbf0: 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57  enameUtf8;.  LPW
cc00: 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20  STR zTmpWide;.. 
cc10: 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d   zTmpWide = winM
cc20: 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  bcsToUnicode(zFi
cc30: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
cc40: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
cc50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cc60: 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20    zFilenameUtf8 
cc70: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
cc80: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
cc90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
cca0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
ccb0: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a   zFilenameUtf8;.
ccc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
ccd0: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
cce0: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
ccf0: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
cd00: 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74  hold the .** ret
cd10: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
cd20: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
cd30: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
cd40: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
cd50: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
cd60: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
cd70: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
cd80: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  ar *zFilenameMbc
cd90: 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  s;.  LPWSTR zTmp
cda0: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
cdb0: 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  e = winUtf8ToUni
cdc0: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
cdd0: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
cde0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
cdf0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
ce00: 61 6d 65 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69  ameMbcs = winUni
ce10: 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57  codeToMbcs(zTmpW
ce20: 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ide);.  sqlite3_
ce30: 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a  free(zTmpWide);.
ce40: 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61    return zFilena
ce50: 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  meMbcs;.}../*.**
ce60: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
ce70: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72  ets the data dir
ce80: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65  ectory or the te
ce90: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
cea0: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  y based on.** th
ceb0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d  e provided argum
cec0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20  ents.  The type 
ced0: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
cee0: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   1 in order to s
cef0: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64  et the.** data d
cf00: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e  irectory or 2 in
cf10: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
cf20: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
cf30: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c  ctory.  The zVal
cf40: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  ue.** argument i
cf50: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
cf60: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75  e directory to u
cf70: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  se.  The return 
cf80: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  value will be.**
cf90: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
cfa0: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
cfb0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
cfc0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f  et_directory(DWO
cfd0: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52  RD type, LPCWSTR
cfe0: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72   zValue){.  char
cff0: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d   **ppDirectory =
d000: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
d010: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
d020: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
d030: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
d040: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
d050: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
d060: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
d070: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
d080: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
d090: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
d0a0: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   &sqlite3_data_d
d0b0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73  irectory;.  }els
d0c0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49  e if( type==SQLI
d0d0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
d0e0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
d0f0: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
d100: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  = &sqlite3_temp_
d110: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20  directory;.  }. 
d120: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
d130: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53  ctory || type==S
d140: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
d150: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
d160: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70            || typ
d170: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
d180: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
d190: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  YPE.  );.  asser
d1a0: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
d1b0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
d1c0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72  ugHasType(*ppDir
d1d0: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f  ectory, MEMTYPE_
d1e0: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70  HEAP) );.  if( p
d1f0: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  pDirectory ){.  
d200: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74    char *zValueUt
d210: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  f8 = 0;.    if( 
d220: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65  zValue && zValue
d230: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61  [0] ){.      zVa
d240: 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69  lueUtf8 = winUni
d250: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75  codeToUtf8(zValu
d260: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a  e);.      if ( z
d270: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a  ValueUtf8==0 ){.
d280: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d290: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
d2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
d2b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44  qlite3_free(*ppD
d2c0: 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a  irectory);.    *
d2d0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56  ppDirectory = zV
d2e0: 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65  alueUtf8;.    re
d2f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
d310: 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
d320: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
d330: 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61  alue of winGetLa
d340: 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73  stErrorMsg.** is
d350: 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72   zero if the err
d360: 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20  or message fits 
d370: 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f  in the buffer, o
d380: 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74  r non-zero.** ot
d390: 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20  herwise (if the 
d3a0: 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e  message was trun
d3b0: 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  cated)..*/.stati
d3c0: 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
d3d0: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
d3e0: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
d3f0: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
d400: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
d410: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
d420: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
d430: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
d440: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
d450: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
d460: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
d470: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
d480: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
d490: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
d4a0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
d4b0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
d4c0: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
d4d0: 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
d4e0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
d4f0: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
d500: 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49  mpWide[SQLITE_WI
d510: 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43  N32_MAX_ERRMSG_C
d520: 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c  HARS+1];.    dwL
d530: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
d540: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
d550: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
d560: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
d590: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
d5c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
d5e0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64 65         zTempWide
d630: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
d650: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
d660: 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20  ERRMSG_CHARS,.  
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
d690: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
d6a0: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
d6b0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
d6c0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
d6d0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
d6e0: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
d710: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
d720: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
d750: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
d760: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
d7b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
d7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
d7f0: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
d800: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
d850: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
d860: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
d870: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
d880: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
d890: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
d8a0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
d8b0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
d8c0: 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
d8d0: 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20  8(zTempWide);.  
d8e0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
d8f0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69  nignMalloc();.#i
d900: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
d910: 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  RT.      /* free
d920: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
d930: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
d940: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
d950: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
d960: 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23  ee(zTempWide);.#
d970: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
d980: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
d990: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
d9a0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
d9b0: 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Temp = NULL;.   
d9c0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
d9d0: 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54  tMessageA(FORMAT
d9e0: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
d9f0: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
da20: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
da30: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
da60: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
da70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
da90: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dad0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52 29           (LPSTR)
db00: 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20   &zTemp,.       
db10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db20: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
db50: 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20  ( dwLen > 0 ){. 
db60: 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
db70: 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f   a buffer and co
db80: 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f  nvert to UTF8 */
db90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
dba0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
dbb0: 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20  );.      zOut = 
dbc0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
dbd0: 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70  cs_to_utf8(zTemp
dbe0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dbf0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
dc00: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65  );.      /* free
dc10: 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66 66   the system buff
dc20: 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er allocated by 
dc30: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f  FormatMessage */
dc40: 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72  .      osLocalFr
dc50: 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d  ee(zTemp);.    }
dc60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
dc70: 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a  ( 0 == dwLen ){.
dc80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
dc90: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
dca0: 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20   "OsError 0x%lx 
dcb0: 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e  (%lu)", lastErrn
dcc0: 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20  o, lastErrno);. 
dcd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63   }else{.    /* c
dce0: 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  opy a maximum of
dcf0: 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f   nBuf chars to o
dd00: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
dd10: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
dd20: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
dd30: 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
dd40: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54    /* free the UT
dd50: 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  F8 buffer */.   
dd60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
dd70: 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
dd80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  n 0;.}../*.**.**
dd90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
dda0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
ddb0: 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65  ne() - is only e
ddc0: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
ddd0: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c  he macro.** winL
dde0: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
ddf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
de00: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
de10: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
de20: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
de30: 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d  ..** It logs a m
de40: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
de50: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
de60: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
de70: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
de80: 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66  ror code and, if
de90: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
dea0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
deb0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a  uivalent from .*
dec0: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e  * FormatMessage.
ded0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
dee0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
def0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
df00: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
df10: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
df20: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
df30: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
df40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
df50: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
df60: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
df70: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
df80: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
df90: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
dfa0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
dfb0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
dfc0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
dfd0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
dfe0: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
dff0: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
e000: 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
e010: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
e020: 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
e030: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
e040: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
e050: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
e080: 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
e090: 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
e0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
e0b0: 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
e0c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e0d0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
e0e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
e0f0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
e100: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
e110: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
e130: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
e140: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
e150: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
e180: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
e190: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
e1a0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
e1b0: 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
e1c0: 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
e1d0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
e1e0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
e1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e200: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
e210: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
e220: 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e  sg[0] = 0;.  win
e230: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
e240: 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
e250: 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
e260: 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
e270: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
e280: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
e290: 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
e2a0: 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
e2b0: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
e2c0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
e2d0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
e2e0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
e2f0: 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
e300: 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
e310: 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29  %d: (%lu) %s(%s)
e320: 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
e330: 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
e340: 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
e350: 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
e360: 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
e370: 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
e380: 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
e390: 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
e3a0: 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
e3b0: 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
e3c0: 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
e3d0: 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
e3e0: 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
e3f0: 20 63 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61   caused by .** a
e400: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
e410: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
e420: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
e430: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
e440: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
e450: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
e460: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
e470: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
e480: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
e490: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
e4a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e4b0: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
e4c0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e4d0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
e4e0: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
e4f0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
e500: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
e510: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
e520: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
e530: 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57  Retry = SQLITE_W
e540: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e550: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
e560: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
e570: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
e580: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
e590: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69  ;../*.** The "wi
e5a0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
e5b0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
e5c0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
e5d0: 20 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a   particular I/O.
e5e0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62  ** error code ob
e5f0: 74 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61  tained via GetLa
e600: 73 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69  stError() is eli
e610: 67 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72  gible to be retr
e620: 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74  ied.  It.** must
e630: 20 61 63 63 65 70 74 20 74 68 65 20 65 72 72 6f   accept the erro
e640: 72 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20  r code DWORD as 
e650: 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  its only argumen
e660: 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74  t and should ret
e670: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  urn.** non-zero 
e680: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
e690: 65 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69  e is transient i
e6a0: 6e 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65  n nature and the
e6b0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65   operation.** re
e6c0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65  sponsible for ge
e6d0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69  nerating the ori
e6e0: 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68  ginal error migh
e6f0: 74 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62  t succeed upon b
e700: 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e  eing.** retried.
e710: 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74    The argument t
e720: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f  o this macro sho
e730: 75 6c 64 20 62 65 20 61 20 76 61 72 69 61 62 6c  uld be a variabl
e740: 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f  e..**.** Additio
e750: 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e  nally, a macro n
e760: 61 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61  amed "winIoerrCa
e770: 6e 52 65 74 72 79 32 22 20 6d 61 79 20 62 65 20  nRetry2" may be 
e780: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a  defined.  If it.
e790: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69  ** is defined, i
e7a0: 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c  t will be consul
e7b0: 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ted only when th
e7c0: 65 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72  e macro "winIoer
e7d0: 72 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72  rCanRetry1".** r
e7e0: 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68  eturns zero.  Th
e7f0: 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
e800: 74 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63  try2" macro is c
e810: 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e  ompletely option
e820: 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65  al and.** may be
e830: 20 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   used to include
e840: 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f   additional erro
e850: 72 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73  r codes in the s
e860: 65 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  et that should.*
e870: 2a 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  * result in the 
e880: 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72  failing I/O oper
e890: 61 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72  ation being retr
e8a0: 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
e8b0: 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65  r.  If.** define
e8c0: 64 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72  d, the "winIoerr
e8d0: 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
e8e0: 20 6d 75 73 74 20 65 78 68 69 62 69 74 20 65 78   must exhibit ex
e8f0: 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73  ternal semantics
e900: 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f  .** identical to
e910: 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77   those of the "w
e920: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
e930: 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20  " macro..*/.#if 
e940: 21 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72  !defined(winIoer
e950: 72 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66  rCanRetry1).#def
e960: 69 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52  ine winIoerrCanR
e970: 65 74 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d  etry1(a) (((a)==
e980: 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
e990: 49 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c  IED)        || \
e9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e9c0: 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49  (a)==ERROR_SHARI
e9d0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20  NG_VIOLATION)   
e9e0: 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
e9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea00: 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
ea10: 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20  LOCK_VIOLATION) 
ea20: 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea40: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
ea50: 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49  RROR_DEV_NOT_EXI
ea60: 53 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ST)        || \.
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
ea90: 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d  a)==ERROR_NETNAM
eaa0: 45 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20 20  E_DELETED)      
eab0: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
eae0: 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20  EM_TIMEOUT)     
eaf0: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
eb20: 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45  ROR_NETWORK_UNRE
eb30: 41 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66  ACHABLE)).#endif
eb40: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
eb50: 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
eb60: 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
eb70: 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
eb80: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
eb90: 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
eba0: 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
ebb0: 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
ebc0: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
ebd0: 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
ebe0: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
ebf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
ec00: 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70  etryIoerr(int *p
ec10: 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70  nRetry, DWORD *p
ec20: 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20  Error){.  DWORD 
ec30: 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  e = osGetLastErr
ec40: 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52  or();.  if( *pnR
ec50: 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65  etry>=winIoerrRe
ec60: 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
ec70: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
ec80: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
ec90: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
eca0: 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65    }.  if( winIoe
ecb0: 72 72 43 61 6e 52 65 74 72 79 31 28 65 29 20 29  rrCanRetry1(e) )
ecc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69  {.    sqlite3_wi
ecd0: 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65  n32_sleep(winIoe
ece0: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
ecf0: 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
ed00: 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
ed10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69  return 1;.  }.#i
ed20: 66 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65  f defined(winIoe
ed30: 72 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65  rrCanRetry2).  e
ed40: 6c 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72  lse if( winIoerr
ed50: 43 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a  CanRetry2(e) ){.
ed60: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
ed70: 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72  2_sleep(winIoerr
ed80: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
ed90: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
eda0: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
edb0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
edc0: 69 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20  if.  if( pError 
edd0: 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  ){.    *pError =
ede0: 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   e;.  }.  return
edf0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67   0;.}../*.** Log
ee00: 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74   a I/O error ret
ee10: 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73  ry episode..*/.s
ee20: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f  tatic void winLo
ee30: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
ee40: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
ee50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ee60: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
ee70: 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  , .      "delaye
ee80: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
ee90: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
eea0: 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72  ",.      winIoer
eeb0: 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74  rRetryDelay*nRet
eec0: 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a  ry*(nRetry+1)/2.
eed0: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69      );.  }.}..#i
eee0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
eef0: 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
ef40: 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
ef50: 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
ef60: 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69  inCE only..*/.#i
ef70: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ef80: 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45  E_MSVC_LOCALTIME
ef90: 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45  _API) || !SQLITE
efa0: 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f  _MSVC_LOCALTIME_
efb0: 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53  API./*.** The MS
efc0: 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77  VC CRT on Window
efd0: 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76  s CE may not hav
efe0: 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
eff0: 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a  function.  So.**
f000: 20 63 72 65 61 74 65 20 61 20 73 75 62 73 74 69   create a substi
f010: 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  tute..*/.#includ
f020: 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
f030: 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
f040: 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
f050: 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
f060: 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
f070: 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
f080: 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
f090: 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
f0a0: 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
f0b0: 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
f0c0: 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
f0d0: 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
f0e0: 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
f0f0: 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
f100: 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
f110: 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
f120: 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
f130: 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69  4 >> 32);.  osFi
f140: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
f150: 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29  eTime(&uTm,&lTm)
f160: 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
f170: 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c  SystemTime(&lTm,
f180: 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65  &pTm);.  y.tm_ye
f190: 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d  ar = pTm.wYear -
f1a0: 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f   1900;.  y.tm_mo
f1b0: 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d  n = pTm.wMonth -
f1c0: 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20   1;.  y.tm_wday 
f1d0: 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b  = pTm.wDayOfWeek
f1e0: 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20  ;.  y.tm_mday = 
f1f0: 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d  pTm.wDay;.  y.tm
f200: 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75  _hour = pTm.wHou
f210: 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20  r;.  y.tm_min = 
f220: 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79  pTm.wMinute;.  y
f230: 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53  .tm_sec = pTm.wS
f240: 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20  econd;.  return 
f250: 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  &y;.}.#endif..#d
f260: 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
f270: 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
f280: 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
f290: 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28  [-(int)offsetof(
f2a0: 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
f2b0: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
f2c0: 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
f2d0: 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
f2e0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
f2f0: 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
f300: 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
f310: 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
f320: 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
f330: 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
f340: 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
f350: 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
f360: 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
f370: 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
f380: 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
f390: 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
f3a0: 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
f3b0: 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
f3c0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
f3d0: 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
f3e0: 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
f3f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
f400: 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
f410: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
f420: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
f430: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
f440: 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
f450: 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61  ic int winceCrea
f460: 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61  teLock(const cha
f470: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69  r *zFilename, wi
f480: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
f490: 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20   LPWSTR zTok;.  
f4a0: 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20  LPWSTR zName;.  
f4b0: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
f4c0: 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20  .  BOOL bLogged 
f4d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20  = FALSE;.  BOOL 
f4e0: 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
f4f0: 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38   zName = winUtf8
f500: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
f510: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
f520: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f  e==0 ){.    /* o
f530: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
f540: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f550: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
f560: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
f570: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
f580: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73  ckdata */.  mems
f590: 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  et(&pFile->local
f5a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c  , 0, sizeof(pFil
f5b0: 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f  e->local));..  /
f5c0: 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61  * Replace the ba
f5d0: 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74  ckslashes from t
f5e0: 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
f5f0: 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a  lowercase it.  *
f600: 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75  * to derive a mu
f610: 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a  tex name. */.  z
f620: 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65  Tok = osCharLowe
f630: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
f640: 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
f650: 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
f660: 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
f670: 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
f680: 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
f690: 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
f6a0: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
f6b0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28   osCreateMutexW(
f6c0: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
f6d0: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
f6e0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
f6f0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f700: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
f710: 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r();.    sqlite3
f720: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
f730: 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
f740: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
f750: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
f760: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
f770: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
f780: 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20  ceCreateLock1", 
f790: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
f7a0: 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
f7b0: 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
f7c0: 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
f7d0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
f7e0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
f7f0: 0a 20 20 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  .  .  /* Since t
f800: 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
f810: 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
f820: 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
f830: 69 6e 67 73 20 65 74 63 20 61 72 65 20 0a 20 20  ings etc are .  
f840: 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76  ** case-sensitiv
f850: 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  e, take advantag
f860: 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70  e of that by upp
f870: 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74  ercasing the mut
f880: 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  ex name.  ** and
f890: 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74   using that as t
f8a0: 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61  he shared filema
f8b0: 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f  pping name..  */
f8c0: 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28  .  osCharUpperW(
f8d0: 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d  zName);.  pFile-
f8e0: 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65  >hShared = osCre
f8f0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
f900: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
f910: 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  ALUE, NULL,.    
f920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49      PAGE_READWRI
f950: 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  TE, 0, sizeof(wi
f960: 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20  nceLock),.      
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 7a 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f    zName);  ..  /
f9a0: 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
f9b0: 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
f9c0: 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
f9d0: 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
f9e0: 20 73 6f 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73   so it .  ** mus
f9f0: 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61  t be zero-initia
fa00: 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45  lized */.  lastE
fa10: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
fa20: 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c  Error();.  if (l
fa30: 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f  astErrno == ERRO
fa40: 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53  R_ALREADY_EXISTS
fa50: 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46  ){.    bInit = F
fa60: 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ALSE;.  }..  sql
fa70: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
fa80: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75  ;..  /* If we su
fa90: 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e  cceeded in makin
faa0: 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
fab0: 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20  ory handle, map 
fac0: 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  it. */.  if( pFi
fad0: 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20  le->hShared ){. 
fae0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
faf0: 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f   = (winceLock*)o
fb00: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  sMapViewOfFile(p
fb10: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a  File->hShared, .
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
fb30: 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f  E_MAP_READ|FILE_
fb40: 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c  MAP_WRITE, 0, 0,
fb50: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
fb60: 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d  k));.    /* If m
fb70: 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63  apping failed, c
fb80: 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64 20  lose the shared 
fb90: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e  memory handle an
fba0: 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20  d erase it */.  
fbb0: 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68    if( !pFile->sh
fbc0: 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46  ared ){.      pF
fbd0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
fbe0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
fbf0: 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  );.      winLogE
fc00: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
fc10: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
fc20: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
fc30: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
fc40: 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65  ateLock2", zFile
fc50: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f  name);.      bLo
fc60: 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  gged = TRUE;.   
fc70: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
fc80: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29  (pFile->hShared)
fc90: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
fca0: 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20  Shared = NULL;. 
fcb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
fcc0: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
fcd0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65  could not be cre
fce0: 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ated, then close
fcf0: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66   the mutex and f
fd00: 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ail */.  if( pFi
fd10: 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c  le->hShared==NUL
fd20: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c  L ){.    if( !bL
fd30: 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70  ogged ){.      p
fd40: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fd50: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
fd60: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
fd70: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
fd80: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
fdb0: 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k3", zFilename);
fdc0: 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
fdd0: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20   TRUE;.    }.   
fde0: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
fdf0: 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
fe00: 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
fe10: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
fe20: 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
fe30: 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
fe40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fe50: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20  _IOERR;.  }.  . 
fe60: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
fe70: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
fe80: 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73   if we're suppos
fe90: 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62  ed to */.  if( b
fea0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Init ){.    mems
feb0: 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  et(pFile->shared
fec0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
fed0: 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20  eLock));.  }..  
fee0: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
fef0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
ff00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ff10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ff20: 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
ff30: 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
ff40: 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
ff50: 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
ff60: 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
ff70: 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
ff80: 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
ff90: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
ffa0: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
ffb0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
ffc0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
ffd0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
ffe0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
fff0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
10000 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
10010 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
10020 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
10030 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
10040 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
10050 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
10060 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
10070 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
10080 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
10090 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
100a0 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
100b0 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
100c0 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
100d0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
100e0 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
100f0 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
10100 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10110 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
10120 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10130 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
10140 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
10150 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
10160 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
10170 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10180 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
10190 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
101a0 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
101b0 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
101c0 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
101d0 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
101e0 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77  .    osUnmapView
101f0 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68  OfFile(pFile->sh
10200 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  ared);.    osClo
10210 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
10220 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
10230 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
10240 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
10250 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10260 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20  File->hMutex);  
10270 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61    .    osCloseHa
10280 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ndle(pFile->hMut
10290 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex);.    pFile->
102a0 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20  hMutex = NULL;. 
102b0 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20   }.}../* .** An 
102c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
102d0 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29  f the LockFile()
102e0 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
102f0 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
10300 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46   BOOL winceLockF
10310 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
10320 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
10330 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
10340 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
10350 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
10360 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
10370 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57  sToLockLow,.  DW
10380 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
10390 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a  esToLockHigh.){.
103a0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
103b0 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
103c0 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
103d0 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
103e0 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
103f0 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
10400 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
10410 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10420 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
10430 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  LockHigh);..  if
10440 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
10450 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
10460 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
10470 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
10480 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67  );..  /* Wanting
10490 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
104a0 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ck? */.  if (dwF
104b0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
104c0 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
104d0 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e 4e  RST.       && nN
104e0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
104f0 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
10500 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20  SHARED_SIZE){.  
10510 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
10520 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d  red->nReaders ==
10530 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68 61   0 && pFile->sha
10540 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
10550 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70 46  == 0){.       pF
10560 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
10570 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a  clusive = TRUE;.
10580 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f         pFile->lo
10590 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d  cal.bExclusive =
105a0 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62 52   TRUE;.       bR
105b0 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
105c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
105d0 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c  nt a read-only l
105e0 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
105f0 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
10600 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
10610 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20 20  RED_FIRST &&.   
10620 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f          nNumberO
10630 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
10640 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
10650 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
10660 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a  xclusive == 0){.
10670 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
10680 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  al.nReaders ++;.
10690 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d        if (pFile-
106a0 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
106b0 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20 70  == 1){.        p
106c0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
106d0 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
106e0 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
106f0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10700 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
10710 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f  pending lock? */
10720 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
10730 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
10740 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59  DWORD)PENDING_BY
10750 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  TE.           &&
10760 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
10770 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
10780 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e      /* If no pen
10790 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62 65  ding lock has be
107a0 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68 65  en acquired, the
107b0 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f 0a  n acquire it */.
107c0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
107d0 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
107e0 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46  == 0) {.      pF
107f0 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
10800 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
10810 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
10820 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  .bPending = TRUE
10830 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
10840 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
10850 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
10860 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f  eserved lock? */
10870 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69  .  else if (dwFi
10880 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
10890 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42  DWORD)RESERVED_B
108a0 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
108b0 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
108c0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
108d0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
108e0 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
108f0 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  d == 0) {.      
10900 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10910 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
10920 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
10930 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
10940 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
10950 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10960 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
10970 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
10980 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
10990 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a  urn bReturn;.}..
109a0 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65  /*.** An impleme
109b0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55  ntation of the U
109c0 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66  nlockFile API of
109d0 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a   Windows for CE.
109e0 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
109f0 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a  inceUnlockFile(.
10a00 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
10a10 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
10a20 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
10a30 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
10a40 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
10a50 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
10a60 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  lockLow,.  DWORD
10a70 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
10a80 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20  oUnlockHigh.){. 
10a90 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
10aa0 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46  = HANDLE_TO_WINF
10ab0 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42  ILE(phFile);.  B
10ac0 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41  OOL bReturn = FA
10ad0 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  LSE;..  UNUSED_P
10ae0 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f  ARAMETER(dwFileO
10af0 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e  ffsetHigh);.  UN
10b00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
10b10 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
10b20 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  nlockHigh);..  i
10b30 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
10b40 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
10b50 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
10b60 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
10b70 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  x);..  /* Releas
10b80 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ing a reader loc
10b90 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76  k or an exclusiv
10ba0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28  e lock */.  if (
10bb0 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
10bc0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
10bd0 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20  _FIRST){.    /* 
10be0 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65  Did we have an e
10bf0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
10c00 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
10c10 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
10c20 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e){.      assert
10c30 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
10c40 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
10c50 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
10c60 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
10c70 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
10c80 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
10c90 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10ca0 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
10cb0 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
10cc0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a   = TRUE;.    }..
10cd0 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75      /* Did we ju
10ce0 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72  st have a reader
10cf0 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c   lock? */.    el
10d00 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f  se if (pFile->lo
10d10 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
10d20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
10d30 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
10d40 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
10d50 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20 20  SHARED_SIZE.    
10d60 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d           || nNum
10d70 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
10d80 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20  ckLow == 1);.   
10d90 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
10da0 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
10db0 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
10dc0 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
10dd0 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  0).      {.     
10de0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10df0 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  ->nReaders --;. 
10e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
10e10 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
10e20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c   }.  }..  /* Rel
10e30 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67  easing a pending
10e40 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
10e50 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
10e60 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45  Low == (DWORD)PE
10e70 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20  NDING_BYTE.     
10e80 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
10e90 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
10ea0 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
10eb0 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
10ec0 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20  Pending){.      
10ed0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
10ee0 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
10ef0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
10f00 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46  ed->bPending = F
10f10 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
10f20 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
10f30 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61  }.  }.  /* Relea
10f40 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64 20  sing a reserved 
10f50 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69  lock */.  else i
10f60 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
10f70 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
10f80 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
10f90 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
10fa0 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
10fb0 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66  ow == 1){.    if
10fc0 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
10fd0 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20 20  Reserved) {.    
10fe0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
10ff0 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
11000 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
11010 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
11020 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
11030 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11040 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
11050 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
11060 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
11070 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
11080 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20  .}./*.** End of 
11090 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65  the special code
110a0 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a   for wince.*****
110b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110f0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
11100 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
11110 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  NCE */../*.** Lo
11120 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
11130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  ..*/.static BOOL
11140 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20   winLockFile(.  
11150 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
11160 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a  .  DWORD flags,.
11170 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f    DWORD offsetLo
11180 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  w,.  DWORD offse
11190 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
111a0 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57  umBytesLow,.  DW
111b0 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ORD numBytesHigh
111c0 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
111d0 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  S_WINCE.  /*.  *
111e0 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
111f0 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
11200 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
11210 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
11220 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20  he Win32.  **   
11230 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
11240 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
11250 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68  winceLockFile(ph
11260 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
11270 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
112a0 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
112b0 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73  #else.  if( osIs
112c0 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
112d0 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
112e0 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
112f0 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
11300 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
11310 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
11320 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
11330 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
11340 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
11350 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a 70   osLockFileEx(*p
11360 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30 2c  hFile, flags, 0,
11370 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
11380 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76 6c  mBytesHigh, &ovl
11390 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
113a0 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
113b0 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73  le(*phFile, offs
113c0 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
113d0 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  h, numBytesLow,.
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
11400 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
11410 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
11420 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 20  a file region.. 
11430 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
11440 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20  inUnlockFile(.  
11450 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c  LPHANDLE phFile,
11460 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
11470 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
11480 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
11490 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
114a0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
114b0 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
114c0 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
114d0 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
114e0 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
114f0 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
11500 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
11510 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
11520 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b 46       API UnlockF
11530 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ile..  */.  retu
11540 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  rn winceUnlockFi
11550 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
11560 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
11570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11580 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
11590 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
115a0 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
115b0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
115c0 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
115d0 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
115e0 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
115f0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
11600 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
11610 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
11620 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
11630 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
11640 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b   return osUnlock
11650 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
11660 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
11670 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
11680 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
11690 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
116a0 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
116b0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
116c0 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
116d0 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
116e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
116f0 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
11700 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  endif.}../******
11710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11750 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  *******.** The n
11760 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ext group of rou
11770 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20  tines implement 
11780 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  the I/O methods 
11790 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
117a0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
117b0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a  ethods object..*
117c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
117f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
11810 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f  /*.** Some Micro
11820 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c  soft compilers l
11830 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74  ack this definit
11840 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
11850 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
11860 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e  _POINTER.# defin
11870 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  e INVALID_SET_FI
11880 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f  LE_POINTER ((DWO
11890 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  RD)-1).#endif../
118a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
118b0 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
118c0 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
118d0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
118e0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
118f0 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
11900 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
11910 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
11920 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a  ful, return 0. .
11930 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
11940 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
11950 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
11960 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
11970 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c  c int winSeekFil
11980 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
11990 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
119a0 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53  iOffset){.#if !S
119b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
119c0 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b   LONG upperBits;
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32   /* Most sig. 32
119f0 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
11a00 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f  set */.  LONG lo
11a10 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  werBits;        
11a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73           /* Leas
11a30 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
11a40 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
11a50 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20    DWORD dwRet;  
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a70 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
11a80 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
11a90 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f  inter() */.  DWO
11aa0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ac0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
11ad0 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
11ae0 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   */..  OSTRACE((
11af0 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "SEEK file=%p, o
11b00 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70  ffset=%lld\n", p
11b10 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74  File->h, iOffset
11b20 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73  ));..  upperBits
11b30 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
11b40 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
11b50 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
11b60 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
11b70 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
11b80 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
11b90 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
11ba0 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
11bb0 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
11bc0 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61  word .  ** conta
11bd0 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20  ining the lower 
11be0 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e  32-bits of the n
11bf0 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20  ew file-offset. 
11c00 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c  Or, if it fails,
11c10 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73  .  ** it returns
11c20 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
11c30 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76  E_POINTER. Howev
11c40 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  er according to 
11c50 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41  MSDN, .  ** INVA
11c60 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
11c70 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
11c80 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
11c90 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
11ca0 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
11cb0 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  er an error has 
11cc0 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65  actually occurre
11cd0 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65  d, it is also ne
11ce0 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20  cessary to call 
11cf0 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
11d00 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
11d10 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
11d20 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
11d30 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
11d40 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
11d50 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
11d60 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
11d70 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
11d80 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
11d90 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
11da0 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
11db0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
11dc0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
11dd0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
11de0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
11df0 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
11e00 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
11e10 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
11e20 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
11e30 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
11e40 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
11e50 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
11e60 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
11e70 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
11e80 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
11e90 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
11ea0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
11eb0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
11ec0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
11ed0 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
11ee0 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
11ef0 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
11f00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
11f10 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
11f20 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
11f30 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
11f40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
11f50 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
11f60 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f80 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
11f90 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
11fa0 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
11fb0 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
11fc0 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
11fd0 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
11fe0 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
11ff0 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
12000 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
12010 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
12020 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12030 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
12040 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
12050 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
12060 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12070 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
12080 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
12090 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
120a0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
120b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
120c0 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
120d0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
120e0 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
120f0 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
12100 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
12110 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
12120 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
12130 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
12140 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
12150 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
12160 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
12170 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
12180 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
12190 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
121a0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
121b0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
121c0 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
121d0 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
121e0 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
121f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12200 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
12210 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
12220 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
12230 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
12240 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
12250 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
12260 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
12270 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
12280 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
12290 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
122a0 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
122b0 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
122c0 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
122d0 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
122e0 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
122f0 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
12300 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
12310 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
12320 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
12330 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
12340 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
12350 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
12360 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
12370 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
12380 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
12390 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
123a0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
123b0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
123c0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
123d0 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
123e0 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
123f0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
12400 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
12410 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
12420 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12430 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
12440 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
12450 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
12460 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
12470 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
12480 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
12490 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
124a0 41 43 45 28 28 22 43 4c 4f 53 45 20 66 69 6c 65  ACE(("CLOSE file
124b0 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
124c0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
124d0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
124e0 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
124f0 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  File);.#endif.. 
12500 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73   do{.    rc = os
12510 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
12520 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69  e->h);.    /* Si
12530 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
12540 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53  c=0; cnt=MX_CLOS
12550 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f  E_ATTEMPT; ); */
12560 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30  .  }while( rc==0
12570 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43   && ++cnt < MX_C
12580 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20  LOSE_ATTEMPT && 
12590 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73  (sqlite3_win32_s
125a0 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b  leep(100), 1) );
125b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
125c0 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e  INCE.#define WIN
125d0 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  CE_DELETION_ATTE
125e0 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65  MPTS 3.  winceDe
125f0 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29  stroyLock(pFile)
12600 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a  ;.  if( pFile->z
12610 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b  DeleteOnClose ){
12620 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
12630 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20  ;.    while(.   
12640 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65          osDelete
12650 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65  FileW(pFile->zDe
12660 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a  leteOnClose)==0.
12670 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74          && osGet
12680 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
12690 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
126a0 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66  Close)!=0xffffff
126b0 66 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63  ff .        && c
126c0 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c  nt++ < WINCE_DEL
126d0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20  ETION_ATTEMPTS. 
126e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c     ){.       sql
126f0 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
12700 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20  (100);  /* Wait 
12710 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20  a little before 
12720 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a  trying again */.
12730 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12740 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44  3_free(pFile->zD
12750 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
12760 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
12770 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
12780 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  >h = NULL;.  }. 
12790 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
127a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  ;.  OSTRACE(("CL
127b0 4f 53 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OSE file=%p, rc=
127c0 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
127d0 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61   rc ? "ok" : "fa
127e0 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
127f0 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  n rc ? SQLITE_OK
12800 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77  .            : w
12810 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12820 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f  E_IOERR_CLOSE, o
12830 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
12840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12850 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43             "winC
12860 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lose", pFile->zP
12870 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ath);.}../*.** R
12880 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
12890 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
128a0 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
128b0 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
128c0 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
128d0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
128e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
128f0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
12900 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
12910 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a  ic int winRead(.
12920 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
12930 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  id,          /* 
12940 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  File to read fro
12950 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  m */.  void *pBu
12960 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
12970 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65    /* Write conte
12980 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  nt into this buf
12990 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  fer */.  int amt
129a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
129b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
129c0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
129d0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
129e0 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f  4 offset       /
129f0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
12a00 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a  at this offset *
12a10 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45  /.){.#if !SQLITE
12a20 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52  _OS_WINCE.  OVER
12a30 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65  LAPPED overlappe
12a40 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
12a50 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65  he offset for Re
12a60 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69  adFile. */.#endi
12a70 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  f.  winFile *pFi
12a80 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
12a90 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64  d;  /* file hand
12aa0 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52  le */.  DWORD nR
12ab0 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
12ac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12ad0 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
12ae0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69  lly read from fi
12af0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
12b00 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
12b10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12b20 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a  r of retrys */..
12b30 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
12b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
12b50 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
12b60 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53  offset>=0 );.  S
12b70 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
12b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12b90 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52  RR_READ);.  OSTR
12ba0 41 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d  ACE(("READ file=
12bb0 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61  %p, buffer=%p, a
12bc0 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74  mount=%d, offset
12bd0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
12be0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
12bf0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
12c00 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65  t, offset, pFile
12c10 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
12c20 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
12c30 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
12c40 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
12c50 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65   of this read re
12c60 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
12c70 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
12c80 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
12c90 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
12ca0 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
12cb0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
12cc0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
12cd0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
12ce0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
12cf0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
12d00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
12d10 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
12d20 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
12d30 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20  offset], amt);. 
12d40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52       OSTRACE(("R
12d50 45 41 44 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70  EAD-MMAP file=%p
12d60 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12d70 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12d80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12d90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
12da0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
12db0 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d  y = (int)(pFile-
12dc0 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
12dd0 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  et);.      memcp
12de0 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
12df0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
12e00 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
12e10 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
12e20 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
12e30 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
12e40 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
12e50 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
12e60 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
12e70 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
12e80 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
12e90 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c  winSeekFile(pFil
12ea0 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20  e, offset) ){.  
12eb0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
12ec0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
12ed0 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69  ITE_FULL\n", pFi
12ee0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
12ef0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
12f00 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f  .  }.  while( !o
12f10 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
12f20 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
12f30 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c  nRead, 0) ){.#el
12f40 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65  se.  memset(&ove
12f50 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65  rlapped, 0, size
12f60 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
12f70 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
12f80 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
12f90 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
12fa0 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  f);.  overlapped
12fb0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
12fc0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
12fd0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
12fe0 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
12ff0 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
13000 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
13010 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  d, &overlapped) 
13020 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65  &&.         osGe
13030 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52  tLastError()!=ER
13040 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29  ROR_HANDLE_EOF )
13050 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f  {.#endif.    DWO
13060 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
13070 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
13080 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
13090 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
130a0 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  nue;.    pFile->
130b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
130c0 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  Errno;.    OSTRA
130d0 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
130e0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
130f0 52 52 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c  RR_READ\n", pFil
13100 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
13110 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
13120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
13130 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13140 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13150 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52             "winR
13160 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ead", pFile->zPa
13170 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f  th);.  }.  winLo
13180 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
13190 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f    if( nRead<(DWO
131a0 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a  RD)amt ){.    /*
131b0 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
131c0 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
131d0 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
131e0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
131f0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65  (char*)pBuf)[nRe
13200 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61  ad], 0, amt-nRea
13210 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  d);.    OSTRACE(
13220 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20  ("READ file=%p, 
13230 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
13240 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70  SHORT_READ\n", p
13250 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13270 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
13280 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
13290 52 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  READ file=%p, rc
132a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
132b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
132c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
132d0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
132e0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
132f0 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
13300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
13310 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
13320 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
13330 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
13340 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13350 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c   winWrite(.  sql
13360 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13380 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e  File to write in
13390 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  to */.  const vo
133a0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
133b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
133c0 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74  ytes to be writt
133d0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  en */.  int amt,
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13400 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
13410 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
13420 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
13430 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
13440 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
13450 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
13460 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g at */.){.  int
13470 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13490 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61  True if error ha
134a0 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65  s occurred, else
134b0 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
134c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
134d0 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
134e0 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
134f0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
13520 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
13530 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
13540 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
13550 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13560 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
13570 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
13580 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
13590 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
135a0 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
135b0 52 41 43 45 28 28 22 57 52 49 54 45 20 66 69 6c  RACE(("WRITE fil
135c0 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
135d0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73   amount=%d, offs
135e0 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  et=%lld, lock=%d
135f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
13600 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
13610 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69  amt, offset, pFi
13620 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
13630 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13640 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
13650 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
13660 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
13670 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
13680 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
13690 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
136a0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
136b0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
136c0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
136d0 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
136e0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
136f0 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
13700 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
13710 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
13720 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
13730 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
13740 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
13750 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
13760 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c  ("WRITE-MMAP fil
13770 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13780 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
13790 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
137a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
137b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
137c0 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
137d0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
137e0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
137f0 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
13800 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
13810 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
13820 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
13830 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
13840 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
13850 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
13860 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
13870 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
13880 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
13890 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
138a0 72 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65  rc = winSeekFile
138b0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b  (pFile, offset);
138c0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
138d0 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66  #else.  {.#endif
138e0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
138f0 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c 41  WINCE.    OVERLA
13900 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
13910 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
13920 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
13930 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
13940 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75     u8 *aRem = (u
13950 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20  8 *)pBuf;       
13960 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20   /* Data yet to 
13970 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
13980 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74    int nRem = amt
13990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
139a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
139b0 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
139c0 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  tten */.    DWOR
139d0 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  D nWrite;       
139e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
139f0 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61  es written by ea
13a00 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63  ch WriteFile() c
13a10 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  all */.    DWORD
13a20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
13a30 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75  ERROR;   /* Valu
13a40 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
13a50 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
13a60 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
13a70 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65 74  WINCE.    memset
13a80 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
13a90 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
13aa0 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61  ED));.    overla
13ab0 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c  pped.Offset = (L
13ac0 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78  ONG)(offset & 0x
13ad0 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f  ffffffff);.    o
13ae0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
13af0 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f  High = (LONG)((o
13b00 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37  ffset>>32) & 0x7
13b10 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66  fffffff);.#endif
13b20 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65  ..    while( nRe
13b30 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  m>0 ){.#if SQLIT
13b40 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20  E_OS_WINCE.     
13b50 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
13b60 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
13b70 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
13b80 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20   0) ){.#else.   
13b90 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
13ba0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
13bb0 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
13bc0 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  e, &overlapped) 
13bd0 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ){.#endif.      
13be0 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
13bf0 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
13c00 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
13c10 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
13c20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
13c30 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
13c40 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
13c50 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
13c60 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
13c70 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
13c80 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
13c90 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
13ca0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
13cb0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
13cc0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
13cd0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
13ce0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72     offset += nWr
13cf0 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ite;.      overl
13d00 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
13d10 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
13d20 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
13d30 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
13d40 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
13d50 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
13d60 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
13d70 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b  dif.      aRem +
13d80 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
13d90 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
13da0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
13db0 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
13dc0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
13dd0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
13de0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
13df0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
13e00 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
13e10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
13e20 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
13e30 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
13e40 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
13e50 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
13e60 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
13e70 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
13e80 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13e90 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c  TE_FULL\n", pFil
13ea0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
13eb0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
13ec0 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46  (SQLITE_FULL, pF
13ed0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69           "winWri
13f00 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te1", pFile->zPa
13f10 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f  th);.    }.    O
13f20 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
13f30 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13f40 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22  E_IOERR_WRITE\n"
13f50 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13f60 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
13f70 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
13f80 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e  R_WRITE, pFile->
13f90 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 22 77 69 6e 57 72 69 74 65 32 22 2c 20 70    "winWrite2", p
13fc0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f  }else{.    winLo
13fe0 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
13ff0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
14000 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72  WRITE file=%p, r
14010 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
14020 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
14030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14040 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
14050 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
14060 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
14070 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
14080 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c   winTruncate(sql
14090 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73  ite3_file *id, s
140a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
140b0 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  te){.  winFile *
140c0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
140d0 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68  *)id;  /* File h
140e0 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  andle object */.
140f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14100 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
14110 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
14120 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
14130 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  on */.  DWORD la
14140 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65  stErrno;..  asse
14150 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
14160 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
14170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14180 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20  RR_TRUNCATE);.  
14190 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
141a0 54 45 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65  TE file=%p, size
141b0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
141c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
141d0 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70  ile->h, nByte, p
141e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
141f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
14200 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
14210 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
14220 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
14230 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
14240 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
14250 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
14260 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
14270 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
14280 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
14290 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
142a0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
142b0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
142c0 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
142d0 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
142e0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
142f0 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
14300 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
14310 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
14320 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
14330 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
14340 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  unk;.  }..  /* S
14350 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65  etEndOfFile() re
14360 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  turns non-zero w
14370 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20  hen successful, 
14380 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20  or zero when it 
14390 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20  fails. */.  if( 
143a0 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c  winSeekFile(pFil
143b0 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  e, nByte) ){.   
143c0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
143d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
143e0 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
143f0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
14400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14410 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20  "winTruncate1", 
14420 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
14430 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73   }else if( 0==os
14440 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69  SetEndOfFile(pFi
14450 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20  le->h) &&.      
14460 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e        ((lastErrn
14470 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
14480 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45  or())!=ERROR_USE
14490 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29  R_MAPPED_FILE) )
144a0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
144b0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
144c0 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  no;.    rc = win
144d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
144e0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
144f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14500 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14510 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
14520 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
14530 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ath);.  }..#if S
14540 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
14550 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68  IZE>0.  /* If th
14560 65 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63  e file was trunc
14570 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73  ated to a size s
14580 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
14590 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d  currently.  ** m
145a0 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
145b0 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
145c0 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
145d0 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
145e0 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65  will.  ** use re
145f0 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
14600 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
14610 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
14620 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20  t from now on.. 
14630 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
14640 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e  >pMapRegion && n
14650 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
14660 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  Size ){.    pFil
14670 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42  e->mmapSize = nB
14680 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  yte;.  }.#endif.
14690 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
146a0 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 72  NCATE file=%p, r
146b0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
146c0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
146d0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
146e0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
146f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
14700 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
14710 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
14720 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
14730 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
14740 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
14750 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
14760 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67  ncs are occuring
14770 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
14780 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
14790 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
147a0 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
147b0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
147c0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
147d0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
147e0 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
147f0 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
14800 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
14810 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
14820 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33   winSync(sqlite3
14830 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
14840 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53  lags){.#ifndef S
14850 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
14860 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c  /*.  ** Used onl
14870 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  y when SQLITE_NO
14880 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
14890 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f  ined..   */.  BO
148a0 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  OL rc;.#endif.#i
148b0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
148c0 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  G) || !defined(S
148d0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c  QLITE_NO_SYNC) |
148e0 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64  | \.    (defined
148f0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
14900 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14910 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a  DEBUG)).  /*.  *
14920 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49  * Used when SQLI
14930 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
14940 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79  t defined and by
14950 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e   the assert() an
14960 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43  d/or.  ** OSTRAC
14970 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a  E() macros..   *
14980 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
14990 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
149a0 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  d;.#else.  UNUSE
149b0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
149c0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
149d0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a  t( pFile );.  /*
149e0 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
149f0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
14a00 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
14a10 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
14a20 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
14a30 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
14a40 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
14a50 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
14a60 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
14a70 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
14a80 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
14a90 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
14aa0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
14ab0 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
14ac0 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
14ad0 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
14ae0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
14af0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
14b00 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
14b10 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
14b20 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
14b30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
14b40 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61  YNC file=%p, fla
14b50 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  gs=%x, lock=%d\n
14b60 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
14b70 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 20 70  ile->h, flags, p
14b80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
14b90 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
14ba0 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  E_TEST.  UNUSED_
14bb0 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
14bc0 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66  ;.#else.  if( (f
14bd0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
14be0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a  TE_SYNC_FULL ){.
14bf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c      sqlite3_full
14c00 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
14c10 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  }.  sqlite3_sync
14c20 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
14c30 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
14c40 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
14c50 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
14c60 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
14c70 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
14c80 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
14c90 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53  ITE_NO_SYNC.  OS
14ca0 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50  TRACE(("SYNC-NOP
14cb0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14cc0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
14cd0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
14ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
14cf0 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46  .  rc = osFlushF
14d00 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65  ileBuffers(pFile
14d10 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ->h);.  Simulate
14d20 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53  IOError( rc=FALS
14d30 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  E );.  if( rc ){
14d40 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
14d50 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  YNC file=%p, rc=
14d60 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
14d70 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
14da0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
14db0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
14dc0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
14dd0 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72 63  SYNC file=%p, rc
14de0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
14df0 59 4e 43 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  YNC\n", pFile->h
14e00 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
14e10 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
14e20 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70  E_IOERR_FSYNC, p
14e30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
14e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e50 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
14e60 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
14e70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
14e80 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
14e90 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
14ea0 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
14eb0 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
14ec0 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71  t winFileSize(sq
14ed0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14ee0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
14ef0 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Size){.  winFile
14f00 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
14f10 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
14f20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
14f30 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
14f40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 69 7a  ;.  assert( pSiz
14f50 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  e!=0 );.  Simula
14f60 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
14f70 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
14f80 54 41 54 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  TAT);.  OSTRACE(
14f90 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20  ("SIZE file=%p, 
14fa0 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69  pSize=%p\n", pFi
14fb0 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a  le->h, pSize));.
14fc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
14fd0 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c  INRT.  {.    FIL
14fe0 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20  E_STANDARD_INFO 
14ff0 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73  info;.    if( os
15000 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
15010 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69  onByHandleEx(pFi
15020 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64  le->h, FileStand
15030 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  ardInfo,.       
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
15060 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
15070 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  )) ){.      *pSi
15080 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46  ze = info.EndOfF
15090 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20  ile.QuadPart;.  
150a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
150b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
150c0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
150d0 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
150e0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
150f0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70  E_IOERR_FSTAT, p
15100 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
15110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15120 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65          "winFile
15130 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Size", pFile->zP
15140 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
15150 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57  #else.  {.    DW
15160 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20  ORD upperBits;. 
15170 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69     DWORD lowerBi
15180 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61  ts;.    DWORD la
15190 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f  stErrno;..    lo
151a0 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46  werBits = osGetF
151b0 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68  ileSize(pFile->h
151c0 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20  , &upperBits);. 
151d0 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73     *pSize = (((s
151e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70  qlite3_int64)upp
151f0 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c  erBits)<<32) + l
15200 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66  owerBits;.    if
15210 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d  (   (lowerBits =
15220 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53  = INVALID_FILE_S
15230 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20 28  IZE).       && (
15240 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
15250 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
15260 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20  NO_ERROR) ){.   
15270 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
15280 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
15290 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
152a0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
152b0 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
152c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
152f0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
15300 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15310 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
15320 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
15330 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25  ize=%p, *pSize=%
15340 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  lld, rc=%s\n",. 
15350 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15360 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a  >h, pSize, *pSiz
15370 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
15380 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
15390 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
153a0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
153b0 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65  EDIATELY is unde
153c0 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69  fined on some Wi
153d0 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a  ndows systems..*
153e0 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  /.#ifndef LOCKFI
153f0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
15400 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  ELY.# define LOC
15410 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
15420 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a  IATELY 1.#endif.
15430 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
15440 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
15450 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
15460 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
15470 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 2.#endif../*.*
15480 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20  * Historically, 
15490 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20  SQLite has used 
154a0 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  both the LockFil
154b0 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  e and LockFileEx
154c0 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57   functions..** W
154d0 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  hen the LockFile
154e0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73   function was us
154f0 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79  ed, it was alway
15500 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61  s expected to fa
15510 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  il.** immediatel
15520 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f  y if the lock co
15530 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  uld not be obtai
15540 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61  ned.  Also, it a
15550 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
15560 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65  o.** obtain an e
15570 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
15580 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
15590 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f  used with the Lo
155a0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
155b0 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74  n.** and reflect
155c0 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69   those expectati
155d0 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ons; therefore, 
155e0 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20  they should not 
155f0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  be changed..*/.#
15600 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
15610 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64  CKFILE_FLAGS.# d
15620 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
15630 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c  KFILE_FLAGS   (L
15640 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
15650 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20  EDIATELY | \.   
15660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
15680 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
15690 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a  E_LOCK).#endif..
156a0 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c  /*.** Currently,
156b0 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61   SQLite never ca
156c0 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  lls the LockFile
156d0 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  Ex function with
156e0 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a  out wanting the.
156f0 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20  ** call to fail 
15700 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
15710 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
15720 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23  e obtained..*/.#
15730 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
15740 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23  CKFILEEX_FLAGS.#
15750 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
15760 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20  OCKFILEEX_FLAGS 
15770 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
15780 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64  MMEDIATELY).#end
15790 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  if../*.** Acquir
157a0 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
157b0 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
157c0 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
157d0 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
157e0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
157f0 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
15800 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  9x or WinNT..*/.
15810 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
15820 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
15830 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
15840 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28   res;.  OSTRACE(
15850 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65  ("READ-LOCK file
15860 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%p, lock=%d\n",
15870 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
15880 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
15890 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
158a0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
158b0 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  NCE.    /*.    *
158c0 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
158d0 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
158e0 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
158f0 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
15900 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20  he Win32.    ** 
15910 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69        API LockFi
15920 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  leEx..    */.   
15930 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b   res = winceLock
15940 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
15950 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
15960 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20   1, 0);.#else.  
15970 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
15980 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
15990 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
159a0 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46  _FLAGS, SHARED_F
159b0 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20  IRST, 0,.       
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
159d0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
159e0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
159f0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
15a00 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
15a10 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20      int lk;.    
15a20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
15a30 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26  ss(sizeof(lk), &
15a40 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lk);.    pFile->
15a50 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
15a60 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30   (short)((lk & 0
15a70 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
15a80 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20  ED_SIZE - 1));. 
15a90 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
15aa0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
15ab0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
15ac0 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
15ae0 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
15af0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
15b00 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
15b10 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 20  endif.  if( res 
15b20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  == 0 ){.    pFil
15b30 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
15b40 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
15b50 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
15b60 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65  to log a failure
15b70 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a   to lock */.  }.
15b80 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
15b90 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
15ba0 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69  esult=%d\n", pFi
15bb0 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
15bc0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
15bd0 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
15be0 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
15bf0 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64  nt winUnlockRead
15c00 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
15c10 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
15c20 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
15c30 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  no;.  OSTRACE(("
15c40 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65  READ-UNLOCK file
15c50 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%p, lock=%d\n",
15c60 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
15c70 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
15c80 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
15c90 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
15ca0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15cb0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
15cc0 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
15cd0 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20   0);.  }.#ifdef 
15ce0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
15cf0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
15d00 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
15d10 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
15d20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
15d30 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
15d40 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
15d50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
15d60 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74  res==0 && ((last
15d70 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
15d80 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
15d90 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a  _NOT_LOCKED) ){.
15da0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
15db0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
15dc0 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
15dd0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
15de0 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  NLOCK, pFile->la
15df0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
15e00 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c           "winUnl
15e10 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46  ockReadLock", pF
15e20 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
15e30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15e40 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
15e50 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20  , result=%d\n", 
15e60 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b  pFile->h, res));
15e70 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
15e80 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
15e90 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
15ea0 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
15eb0 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
15ec0 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
15ed0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15ee0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
15ef0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
15f00 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
15f10 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
15f20 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
15f30 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
15f40 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
15f50 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
15f60 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
15f70 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
15f80 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
15f90 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
15fa0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
15fb0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
15fc0 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
15fd0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
15fe0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
15ff0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
16000 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
16010 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
16020 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
16030 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
16040 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
16050 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
16060 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
16070 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
16080 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
16090 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
160a0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
160b0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
160c0 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
160d0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
160e0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
160f0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
16100 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
16110 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
16120 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
16130 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
16140 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16150 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
16160 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b  .  The winUnlock
16170 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72  () routine.** er
16180 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ases all locks a
16190 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72  t once and retur
161a0 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c  ns us immediatel
161b0 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  y to locking lev
161c0 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  el 0..** It is n
161d0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  ot possible to l
161e0 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
161f0 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20   level one step 
16200 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a  at a time.  You.
16210 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69  ** must go strai
16220 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ght to locking l
16230 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  evel 0..*/.stati
16240 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71  c int winLock(sq
16250 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
16260 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
16270 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16280 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72  _OK;    /* Retur
16290 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72  n code from subr
162a0 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
162b0 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
162c0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
162d0 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20   a Windows lock 
162e0 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  call */.  int ne
162f0 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20  wLocktype;      
16300 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c   /* Set pFile->l
16310 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20  ocktype to this 
16320 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69  value before exi
16330 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f  ting */.  int go
16340 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
16350 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61  ;/* True if we a
16360 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e  cquired a PENDIN
16370 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65  G lock this time
16380 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
16390 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
163a0 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
163b0 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
163c0 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  R;..  assert( id
163d0 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
163e0 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
163f0 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
16400 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
16410 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16420 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
16430 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
16440 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
16450 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  ktype));..  /* I
16460 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
16470 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
16480 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
16490 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
164a0 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
164b0 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
164c0 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
164d0 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
164e0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
164f0 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
16500 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
16510 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
16520 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
16530 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
16540 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48  OSTRACE(("LOCK-H
16550 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ELD file=%p, rc=
16560 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
16570 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
16580 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16590 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
165a0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
165b0 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
165c0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ect.  */.  asser
165d0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
165e0 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c  pe!=NO_LOCK || l
165f0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
16600 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16610 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44  ( locktype!=PEND
16620 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ING_LOCK );.  as
16630 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
16640 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
16650 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
16660 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
16670 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20  ..  /* Lock the 
16680 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
16690 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
166a0 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e  acquire a PENDIN
166b0 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61  G lock or.  ** a
166c0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49   SHARED lock.  I
166d0 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69  f we are acquiri
166e0 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
166f0 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f  , the acquisitio
16700 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45  n of.  ** the PE
16710 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
16720 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20  is temporary..  
16730 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  */.  newLocktype
16740 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
16750 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69  pe;.  if(   (pFi
16760 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
16770 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28  _LOCK).     || (
16780 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58     (locktype==EX
16790 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
167a0 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65         && (pFile
167b0 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
167c0 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  RVED_LOCK)).  ){
167d0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33  .    int cnt = 3
167e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
167f0 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77  -->0 && (res = w
16800 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
16810 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
16820 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59        PENDING_BY
16860 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30  TE, 0, 1, 0))==0
16870 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
16880 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20   3 times to get 
16890 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  the pending lock
168a0 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65  .  This is neede
168b0 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20  d to work.      
168c0 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65  ** around proble
168d0 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64  ms caused by ind
168e0 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74  exing and/or ant
168f0 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  i-virus software
16900 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e   on.      ** Win
16910 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20  dows systems..  
16920 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72      ** If you ar
16930 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64  e using this cod
16940 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72  e as a model for
16950 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53   alternative VFS
16960 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20  es, do not.     
16970 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65   ** copy this re
16980 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69  try logic.  It i
16990 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65  s a hack intende
169a0 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e  d for Windows on
169b0 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
169c0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
169d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
169e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
169f0 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41  "LOCK-PENDING-FA
16a00 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e  IL file=%p, coun
16a10 74 3d 25 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c  t=%d, result=%d\
16a20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
16a30 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74     pFile->h, cnt
16a40 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 20 20 69  , res));.      i
16a50 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
16a60 52 4f 52 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ROR_INVALID_HAND
16a70 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  LE ){.        pF
16a80 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16a90 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
16aa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16ab0 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
16ac0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
16ad0 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  CK-FAIL file=%p,
16ae0 20 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73   count=%d, rc=%s
16af0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16b00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
16b10 63 6e 74 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  cnt, sqlite3ErrN
16b20 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
16b30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16b40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16b50 63 6e 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69  cnt ) sqlite3_wi
16b60 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20  n32_sleep(1);.  
16b70 20 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69    }.    gotPendi
16b80 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20  ngLock = res;.  
16b90 20 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20    if( !res ){.  
16ba0 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
16bb0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16bd0 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72  * Acquire a shar
16be0 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ed lock.  */.  i
16bf0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
16c00 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  RED_LOCK && res 
16c10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16c20 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
16c30 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  NO_LOCK );.    r
16c40 65 73 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c  es = winGetReadL
16c50 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
16c60 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
16c70 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53   newLocktype = S
16c80 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
16c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
16ca0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16cb0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
16cc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
16cd0 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
16ce0 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
16cf0 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44  cktype==RESERVED
16d00 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
16d10 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16d20 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  e->locktype==SHA
16d30 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
16d40 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
16d50 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
16d60 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
16d70 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  GS, RESERVED_BYT
16d80 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
16d90 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
16da0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16db0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20  RESERVED_LOCK;. 
16dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16dd0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16de0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16df0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
16e00 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
16e10 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
16e20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
16e30 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
16e40 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  ){.    newLockty
16e50 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  pe = PENDING_LOC
16e60 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e  K;.    gotPendin
16e70 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a  gLock = 0;.  }..
16e80 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20    /* Acquire an 
16e90 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20  EXCLUSIVE lock. 
16ea0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
16eb0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
16ec0 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
16ed0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
16ee0 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44  locktype>=SHARED
16ef0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
16f00 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64   = winUnlockRead
16f10 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
16f20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
16f30 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
16f40 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
16f50 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
16f60 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
16f70 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
16f80 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
16f90 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
16fa0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
16fb0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
16fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16fd0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
16fe0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16ff0 20 20 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c       winGetReadL
17000 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
17010 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
17020 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
17030 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61  PENDING lock tha
17040 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65  t ought to be re
17050 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a  leased, then.  *
17060 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77  * release it now
17070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74  ..  */.  if( got
17080 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c  PendingLock && l
17090 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
170a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
170b0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
170c0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
170d0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
170e0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
170f0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c  e state of the l
17100 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20  ock has held in 
17110 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17120 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  tor then.  ** re
17130 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
17140 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65  iate result code
17150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
17160 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
17170 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
17180 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
17190 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
171a0 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  o;.    rc = SQLI
171b0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54  TE_BUSY;.    OST
171c0 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c  RACE(("LOCK-FAIL
171d0 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64   file=%p, wanted
171e0 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a  =%d, got=%d\n",.
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
17200 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
17210 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a   newLocktype));.
17220 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
17230 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c  ktype = (u8)newL
17240 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41  ocktype;.  OSTRA
17250 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25  CE(("LOCK file=%
17260 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25  p, lock=%d, rc=%
17270 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
17280 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
17290 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69  ->locktype, sqli
172a0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
172b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
172c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
172d0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
172e0 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
172f0 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
17300 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
17310 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
17320 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
17330 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
17340 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75  ck is held, retu
17350 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
17360 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a  otherwise zero..
17370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17380 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  nCheckReservedLo
17390 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
173a0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
173b0 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  t){.  int res;. 
173c0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
173d0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
173e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
173f0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
17400 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
17410 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
17420 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
17430 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
17440 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70  pResOut=%p\n", p
17450 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74  File->h, pResOut
17460 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  ));..  assert( i
17470 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
17480 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52  ile->locktype>=R
17490 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
174a0 20 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20      res = 1;.   
174b0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d   OSTRACE(("TEST-
174c0 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  WR-LOCK file=%p,
174d0 20 72 65 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61   result=%d (loca
174e0 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  l)\n", pFile->h,
174f0 20 72 65 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b   res));.  }else{
17500 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
17510 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17520 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
17530 45 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56  EEX_FLAGS,RESERV
17540 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
17550 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
17560 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63  {.      winUnloc
17570 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17580 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
17590 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, 1, 0);.    }.
175a0 20 20 20 20 72 65 73 20 3d 20 21 72 65 73 3b 0a      res = !res;.
175b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
175c0 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
175d0 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28 72  %p, result=%d (r
175e0 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65  emote)\n", pFile
175f0 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 0a  ->h, res));.  }.
17600 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
17610 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
17620 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
17630 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20  %p, pResOut=%p, 
17640 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d  *pResOut=%d, rc=
17650 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
17660 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
17670 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65  h, pResOut, *pRe
17680 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  sOut));.  return
17690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
176a0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
176b0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
176c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
176d0 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20  id to locktype. 
176e0 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73   locktype.** mus
176f0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
17700 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
17710 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
17720 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
17730 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
17740 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
17750 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
17760 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
17770 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
17780 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
17790 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  o-op..**.** It i
177a0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
177b0 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
177c0 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73  to fail if the s
177d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
177e0 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49  * is NO_LOCK.  I
177f0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
17800 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f  ument is SHARED_
17810 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72  LOCK then this r
17820 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20  outine.** might 
17830 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
17840 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ERR;.*/.static i
17850 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c  nt winUnlock(sql
17860 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17870 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
17880 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46  int type;.  winF
17890 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
178a0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
178b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
178c0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
178d0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
178e0 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45   locktype<=SHARE
178f0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52  D_LOCK );.  OSTR
17900 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
17910 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64  e=%p, oldLock=%d
17920 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64  (%d), newLock=%d
17930 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
17940 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
17950 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
17960 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
17970 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  , locktype));.  
17980 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
17990 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79  cktype;.  if( ty
179a0 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe>=EXCLUSIVE_LO
179b0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
179c0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
179d0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
179e0 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
179f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63   0);.    if( loc
17a00 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
17a10 43 4b 20 26 26 20 21 77 69 6e 47 65 74 52 65 61  CK && !winGetRea
17a20 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a  dLock(pFile) ){.
17a30 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
17a40 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
17a50 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c  n.  We should al
17a60 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a  ways be able to.
17a70 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69        ** reacqui
17a80 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
17a90 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
17aa0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
17ab0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
17ac0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
17ad0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17ae0 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c           "winUnl
17af0 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ock", pFile->zPa
17b00 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  th);.    }.  }. 
17b10 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45 52   if( type>=RESER
17b20 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
17b30 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
17b40 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
17b50 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
17b60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63 6b  ;.  }.  if( lock
17b70 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  type==NO_LOCK &&
17b80 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f   type>=SHARED_LO
17b90 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
17ba0 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
17bb0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  e);.  }.  if( ty
17bc0 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
17bd0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
17be0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17bf0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
17c00 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 1, 0);.  }.  p
17c10 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
17c20 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
17c30 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
17c40 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
17c50 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
17c60 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
17c70 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
17c80 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  pe, sqlite3ErrNa
17c90 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
17ca0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17cb0 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74  If *pArg is init
17cc0 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
17cd0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
17ce0 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
17cf0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
17d00 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
17d10 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
17d20 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
17d30 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
17d40 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
17d50 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
17d60 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
17d70 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
17d80 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
17d90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
17da0 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
17db0 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
17dc0 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
17dd0 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
17de0 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
17df0 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
17e00 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
17e10 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
17e20 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
17e30 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
17e40 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
17e50 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
17e60 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
17e70 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
17e80 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
17e90 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
17ea0 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74  thods used for t
17eb0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
17ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17ed0 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
17ee0 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20  te3_vfs *, char 
17ef0 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
17f00 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
17f10 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42  oid *);.static B
17f20 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
17f30 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e  tterAndColon(con
17f40 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a  st char *);../*.
17f50 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
17f60 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
17f70 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
17f80 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
17f90 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
17fa0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17fb0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
17fc0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
17fd0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
17fe0 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  d;.  OSTRACE(("F
17ff0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70  CNTL file=%p, op
18000 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c  =%d, pArg=%p\n",
18010 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70   pFile->h, op, p
18020 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28  Arg));.  switch(
18030 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
18040 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
18050 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
18060 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
18070 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
18080 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18090 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
180a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
180b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
180c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
180d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
180e0 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
180f0 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
18100 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29  nt*)pArg = (int)
18110 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
18120 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18130 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18140 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18150 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18160 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18170 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18180 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18190 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a  L_CHUNK_SIZE: {.
181a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43        pFile->szC
181b0 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70  hunk = *(int *)p
181c0 41 72 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  Arg;.      OSTRA
181d0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
181e0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
181f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18220 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18230 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20  CNTL_SIZE_HINT: 
18240 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 6c  {.      if( pFil
18250 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
18260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
18270 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20  int64 oldSz;.   
18280 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
18290 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f  nFileSize(id, &o
182a0 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ldSz);.        i
182b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
182c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
182d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53  lite3_int64 newS
182e0 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e  z = *(sqlite3_in
182f0 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  t64*)pArg;.     
18300 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f       if( newSz>o
18310 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ldSz ){.        
18320 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
18330 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
18340 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
18350 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e  inTruncate(id, n
18360 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ewSz);.         
18370 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18380 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
18390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
183a0 20 7d 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41   }.        OSTRA
183b0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
183c0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
183d0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
183e0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
183f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
18410 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18420 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
18430 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
18440 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
18450 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18460 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
18470 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
18480 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _WAL: {.      in
18490 74 20 62 50 65 72 73 69 73 74 20 3d 20 2a 28 69  t bPersist = *(i
184a0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
184b0 69 66 28 20 62 50 65 72 73 69 73 74 3c 30 20 29  if( bPersist<0 )
184c0 7b 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74 2a  {.        *(int*
184d0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 62  )pArg = pFile->b
184e0 50 65 72 73 69 73 74 57 61 6c 3b 0a 20 20 20 20  PersistWal;.    
184f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18500 20 70 46 69 6c 65 2d 3e 62 50 65 72 73 69 73 74   pFile->bPersist
18510 57 61 6c 20 3d 20 62 50 65 72 73 69 73 74 21 3d  Wal = bPersist!=
18520 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
18530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18540 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18550 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
18560 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
18570 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
18580 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
18590 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
185a0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
185b0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
185c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
185d0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
185e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
185f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18600 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
18610 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
18620 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
18630 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
18640 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
18650 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
18660 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18670 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18680 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18690 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
186a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
186b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
186c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
186d0 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
186e0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
186f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
18700 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
18710 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
18720 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
18730 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
18740 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18750 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
18760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18780 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
18790 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
187a0 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
187b0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
187c0 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
187d0 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
187e0 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
187f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18800 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
18810 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
18820 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
18830 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
18840 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
18850 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
18860 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
18870 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
18880 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
18890 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
188a0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
188b0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
188c0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
188d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
188e0 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  K;.    }.#ifdef 
188f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
18900 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18910 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44  L_WIN32_SET_HAND
18920 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41  LE: {.      LPHA
18930 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c  NDLE phFile = (L
18940 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20  PHANDLE)pArg;.  
18950 20 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46      HANDLE hOldF
18960 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  ile = pFile->h;.
18970 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
18980 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20 20 20   *phFile;.      
18990 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69  *phFile = hOldFi
189a0 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  le;.      OSTRAC
189b0 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c  E(("FCNTL oldFil
189c0 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70  e=%p, newFile=%p
189d0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
189e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
189f0 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c    hOldFile, pFil
18a00 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
18a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18a20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18a30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
18a40 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
18a50 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
18a60 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  TFile = 0;.     
18a70 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74   int rc = winGet
18a80 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
18a90 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a  pVfs, &zTFile);.
18aa0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18ac0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
18ad0 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
18ae0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
18af0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18b00 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
18b10 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
18b20 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
18b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18b40 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
18b50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
18b60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
18b70 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
18b80 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
18b90 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
18ba0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
18bb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
18bc0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
18bd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18be0 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
18bf0 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
18c00 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18c10 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
18c20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34     }.      *(i64
18c30 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
18c40 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
18c50 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
18c60 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
18c70 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
18c80 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
18c90 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
18ca0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
18cb0 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
18cc0 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
18cd0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
18ce0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
18cf0 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
18d00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
18d10 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
18d20 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
18d30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
18d40 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18d50 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
18d60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
18d70 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
18d80 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
18d90 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
18da0 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  if.  }.  OSTRACE
18db0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
18dc0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46  , rc=SQLITE_NOTF
18dd0 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  OUND\n", pFile->
18de0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
18df0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
18e00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18e10 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
18e20 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
18e30 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
18e40 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
18e50 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
18e60 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
18e70 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
18e80 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
18e90 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
18ea0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
18eb0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
18ec0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
18ed0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
18ee0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
18ef0 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
18f00 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
18f10 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
18f20 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
18f30 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
18f40 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
18f50 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
18f60 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
18f70 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
18f80 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
18f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
18fa0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
18fb0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
18fc0 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75  (void)id;.  retu
18fd0 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
18fe0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
18ff0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
19000 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
19010 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
19020 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
19030 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
19040 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
19050 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77  3_file *id){.  w
19060 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e  inFile *p = (win
19070 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75  File*)id;.  retu
19080 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
19090 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
190a0 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20  _OPEN |.        
190b0 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20   ((p->ctrlFlags 
190c0 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f  & WINFILE_PSOW)?
190d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
190e0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
190f0 3a 30 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 57  :0);.}../* .** W
19100 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
19110 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
19120 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
19130 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
19140 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
19150 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
19160 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
19170 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
19180 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
19190 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
191a0 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
191b0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  ize..*/.static S
191c0 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
191d0 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20  sInfo;..#ifndef 
191e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
191f0 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
19200 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
19210 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
19220 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
19230 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
19240 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
19250 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
19260 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
19270 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  s used by .** th
19280 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
19290 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
192a0 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
192b0 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
192c0 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
192d0 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
192e0 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
192f0 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
19300 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
19310 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
19320 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19330 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
19340 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
19350 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
19360 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
19370 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
19380 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
19390 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
193a0 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
193b0 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
193c0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
193d0 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
193e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
193f0 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
19400 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
19410 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
19420 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
19430 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
19440 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
19450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
19460 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
19470 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
19480 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
19490 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  );.}.#ifndef NDE
194a0 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77  BUG.static int w
194b0 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76  inShmMutexHeld(v
194c0 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
194d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
194e0 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
194f0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
19500 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
19510 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
19520 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
19530 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69  o represent a si
19540 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  ngle file opened
19550 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20   and mmapped to 
19560 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65  provide.** share
19570 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  d memory.  When 
19580 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
19590 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74   all reference t
195a0 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73  he same.** log-s
195b0 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72  ummary, each thr
195c0 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20  ead has its own 
195d0 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20  winFile object, 
195e0 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20  but they all.** 
195f0 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
19600 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
19610 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  is object.  In o
19620 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
19630 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20  .** log-summary 
19640 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f  is opened only o
19650 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
19660 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  .**.** winShmMut
19670 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
19680 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74   true when creat
19690 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e  ing or destroyin
196a0 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74  g.** this object
196b0 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e   or while readin
196c0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
196d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
196e0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52  s:.**.**      nR
196f0 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74  ef.**      pNext
19700 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c   .**.** The foll
19710 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
19720 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
19730 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
19740 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
19750 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
19760 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
19770 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64  Either winShmNod
19780 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
19790 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f  held or winShmNo
197a0 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
197b0 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
197c0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
197d0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
197e0 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
197f0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
19800 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a  tructure..**.*/.
19810 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
19820 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e {.  sqlite3_mu
19830 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
19840 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
19850 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
19860 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
19870 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
19880 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
19890 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ile */.  winFile
198a0 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20   hFile;         
198b0 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
198c0 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20  le from winOpen 
198d0 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69  */..  int szRegi
198e0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
198f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
19900 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
19910 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69  s */.  int nRegi
19920 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
19930 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
19940 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
19950 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
19960 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68  n {.    HANDLE h
19970 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
19980 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
19990 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d  from CreateFileM
199a0 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f  apping */.    vo
199b0 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61  id *pMap;.  } *a
199c0 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  Region;.  DWORD 
199d0 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
199e0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
199f0 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
19a00 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
19a10 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66  r */..  int nRef
19a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19a30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19a40 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
19a50 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
19a60 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69  */.  winShm *pFi
19a70 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
19a80 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62  /* All winShm ob
19a90 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
19aa0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
19ab0 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20  hmNode *pNext;  
19ac0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
19ad0 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69  n list of all wi
19ae0 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
19af0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
19b00 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78  E_DEBUG.  u8 nex
19b10 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
19b20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
19b30 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64  ilable winShm.id
19b40 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
19b50 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f  .};../*.** A glo
19b60 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c  bal array of all
19b70 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
19b80 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  cts..**.** The w
19b90 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
19ba0 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
19bb0 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
19bc0 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74  riting this list
19bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53  ..*/.static winS
19be0 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f  hmNode *winShmNo
19bf0 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
19c00 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
19c10 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
19c20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
19c30 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
19c40 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
19c50 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
19c60 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
19c70 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
19c80 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
19c90 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
19ca0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
19cb0 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
19cc0 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
19cd0 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68  **    winShm.pSh
19ce0 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53  mNode.**    winS
19cf0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
19d00 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
19d10 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
19d20 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64  e winShm.pShmNod
19d30 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
19d40 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
19d50 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
19d60 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
19d70 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
19d80 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20   {.  winShmNode 
19d90 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
19da0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
19db0 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  g winShmNode obj
19dc0 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ect */.  winShm 
19dd0 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
19de0 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53      /* Next winS
19df0 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
19e00 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
19e10 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
19e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19e30 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
19e40 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75  he winShmNode mu
19e50 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  tex */.  u16 sha
19e60 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
19e70 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
19e80 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
19e90 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
19ea0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
19eb0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
19ec0 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
19ed0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
19ee0 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b  E_DEBUG.  u8 id;
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f00 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
19f10 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
19f20 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64  th its winShmNod
19f30 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
19f40 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
19f50 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
19f60 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f  .*/.#define WIN_
19f70 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
19f80 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
19f90 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66  )*4)        /* f
19fa0 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
19fb0 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
19fc0 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48  M_DMS    (WIN_SH
19fd0 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
19fe0 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
19ff0 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
1a000 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
1a010 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1a020 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
1a030 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
1a040 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e  .#define _SHM_UN
1a050 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f  LCK  1.#define _
1a060 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65  SHM_RDLCK  2.#de
1a070 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  fine _SHM_WRLCK 
1a080 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
1a090 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  nShmSystemLock(.
1a0a0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46    winShmNode *pF
1a0b0 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79  ile,    /* Apply
1a0c0 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
1a0d0 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
1a0e0 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
1a0f0 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
1a100 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c       /* _SHM_UNL
1a110 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  CK, _SHM_RDLCK, 
1a120 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f  or _SHM_WRLCK */
1a130 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1a140 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1a150 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
1a160 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e   to be locked/un
1a170 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
1a180 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
1a190 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1a1a0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  ytes to lock or 
1a1b0 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  unlock */.){.  i
1a1c0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1a1d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a1e0 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e  ode form Lock/Un
1a1f0 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a  lockFileEx() */.
1a200 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1a210 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  the winShmNode o
1a220 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
1a230 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
1a240 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
1a250 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1a260 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20  d(pFile->mutex) 
1a270 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d  || pFile->nRef==
1a280 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  0 );..  OSTRACE(
1a290 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ("SHM-LOCK file=
1a2a0 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66  %p, lock=%d, off
1a2b0 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c  set=%d, size=%d\
1a2c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1a2d0 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c  File->hFile.h, l
1a2e0 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e  ockType, ofst, n
1a2f0 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  Byte));..  /* Re
1a300 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68  lease/Acquire th
1a310 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1a320 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ock */.  if( loc
1a330 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
1a340 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  K ){.    rc = wi
1a350 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
1a360 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73  le->hFile.h, ofs
1a370 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t, 0, nByte, 0);
1a380 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1a390 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1a3a0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
1a3b0 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  rs */.    DWORD 
1a3c0 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49  dwFlags = LOCKFI
1a3d0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
1a3e0 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  ELY;.    if( loc
1a3f0 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52  kType == _SHM_WR
1a400 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d  LCK ) dwFlags |=
1a410 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
1a420 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  IVE_LOCK;.    rc
1a430 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
1a440 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1a450 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30  dwFlags, ofst, 0
1a460 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
1a470 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30  .  .  if( rc!= 0
1a480 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a490 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
1a4a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1a4b0 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61  Errno =  osGetLa
1a4c0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
1a4d0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1a4e0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
1a4f0 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ("SHM-LOCK file=
1a500 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72  %p, func=%s, err
1a510 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22  no=%lu, rc=%s\n"
1a520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1a530 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f  le->hFile.h, (lo
1a540 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55  ckType == _SHM_U
1a550 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f  NLCK) ? "winUnlo
1a560 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20  ckFile" :.      
1a570 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c       "winLockFil
1a580 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  e", pFile->lastE
1a590 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72  rrno, sqlite3Err
1a5a0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72  Name(rc)));..  r
1a5b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1a5c0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1a5d0 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
1a5e0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1a5f0 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  winOpen(sqlite3_
1a600 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  vfs*,const char*
1a610 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  ,sqlite3_file*,i
1a620 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  nt,int*);.static
1a630 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73   int winDelete(s
1a640 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e  qlite3_vfs *,con
1a650 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
1a660 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
1a670 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  winShmNodeList l
1a680 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
1a690 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f  es with winShmNo
1a6a0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1a6b0 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1a6c0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1a6d0 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1a6e0 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1a6f0 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1a700 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1a710 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1a720 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1a730 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66  Purge(sqlite3_vf
1a740 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c  s *pVfs, int del
1a750 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53  eteFlag){.  winS
1a760 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77  hmNode **pp;.  w
1a770 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20  inShmNode *p;.  
1a780 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
1a790 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f  texHeld() );.  O
1a7a0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1a7b0 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65  GE pid=%lu, dele
1a7c0 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20  teFlag=%d\n",.  
1a7d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1a7e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1a7f0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a  , deleteFlag));.
1a800 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f    pp = &winShmNo
1a810 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
1a820 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b   (p = *pp)!=0 ){
1a830 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
1a840 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1a850 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   i;.      if( p-
1a860 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65  >mutex ){ sqlite
1a870 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
1a880 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20  mutex); }.      
1a890 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
1a8a0 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
1a8b0 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20       BOOL bRc = 
1a8c0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
1a8d0 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1a8e0 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
1a8f0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1a900 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75  GE-UNMAP pid=%lu
1a910 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1a920 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1a930 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1a940 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1a950 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1a960 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1a970 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1a980 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1a990 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
1a9a0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e  sCloseHandle(p->
1a9b0 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
1a9c0 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
1a9d0 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c  E(("SHM-PURGE-CL
1a9e0 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  OSE pid=%lu, reg
1a9f0 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ion=%d, rc=%s\n"
1aa00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aa10 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1aa20 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62  rocessId(), i, b
1aa30 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
1aa40 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
1aa50 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f  UNUSED_VARIABLE_
1aa60 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20  VALUE(bRc);.    
1aa70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
1aa80 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26  >hFile.h!=NULL &
1aa90 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e  & p->hFile.h!=IN
1aaa0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1aab0 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  UE ){.        Si
1aac0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1aad0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1aae0 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  winClose((sqlite
1aaf0 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69  3_file *)&p->hFi
1ab00 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  le);.        Sim
1ab10 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ab20 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1ab30 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
1ab40 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53  lag ){.        S
1ab50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1ab60 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1ab70 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
1ab80 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1ab90 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70       winDelete(p
1aba0 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d  Vfs, p->zFilenam
1abb0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
1abc0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1abd0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1abe0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1abf0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1ac00 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
1ac10 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1ac20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1ac30 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  Region);.      s
1ac40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1ac50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ac60 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b   pp = &p->pNext;
1ac70 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1ac80 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61  .** Open the sha
1ac90 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1aca0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1acb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
1acc0 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  bFd..**.** When 
1acd0 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1ace0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1acf0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1ad00 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1ad10 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1ad20 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1ad30 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1ad40 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1ad50 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1ad60 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1ad70 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1ad80 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1ad90 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1ada0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1adb0 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1adc0 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  ry(winFile *pDbF
1add0 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e  d){.  struct win
1ade0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1adf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ae00 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1ae10 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1ae20 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
1ae30 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20  pShmNode = 0;   
1ae40 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1ae50 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
1ae60 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1ae90 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63   code */.  struc
1aea0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e  t winShmNode *pN
1aeb0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
1aec0 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
1aed0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1aee0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
1af10 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Name in bytes */
1af20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ..  assert( pDbF
1af30 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20  d->pShm==0 );   
1af40 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73   /* Not previous
1af50 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20  ly opened */..  
1af60 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1af70 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71  e for the new sq
1af80 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74  lite3_shm object
1af90 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74  .  Also speculat
1afa0 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ively.  ** alloc
1afb0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
1afc0 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61  new winShmNode a
1afd0 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a  nd filename..  *
1afe0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  /.  p = sqlite3M
1aff0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1b000 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1b010 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1b020 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1b030 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
1b040 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64  e3Strlen30(pDbFd
1b050 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77  ->zPath);.  pNew
1b060 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1b070 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53  Zero( sizeof(*pS
1b080 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20  hmNode) + nName 
1b090 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e  + 17 );.  if( pN
1b0a0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ew==0 ){.    sql
1b0b0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1b0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b0d0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
1b0e0 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  .  pNew->zFilena
1b0f0 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65  me = (char*)&pNe
1b100 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  w[1];.  sqlite3_
1b110 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31  snprintf(nName+1
1b120 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  5, pNew->zFilena
1b130 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44  me, "%s-shm", pD
1b140 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73  bFd->zPath);.  s
1b150 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
1b160 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  3(pDbFd->zPath, 
1b170 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
1b180 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f  ; ..  /* Look to
1b190 20 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73   see if there is
1b1a0 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e   an existing win
1b1b0 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e  ShmNode that can
1b1c0 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49   be used..  ** I
1b1d0 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69  f no matching wi
1b1e0 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74  nShmNode current
1b1f0 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65 61 74  ly exists, creat
1b200 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a  e a new one..  *
1b210 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1b220 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53  utex();.  for(pS
1b230 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e  hmNode = winShmN
1b240 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64  odeList; pShmNod
1b250 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d  e; pShmNode=pShm
1b260 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Node->pNext){.  
1b270 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f    /* TBD need to
1b280 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65   come up with be
1b290 74 74 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e  tter match here.
1b2a0 20 20 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a    Perhaps.    **
1b2b0 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54   use FILE_ID_BOT
1b2c0 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63  H_DIR_INFO Struc
1b2d0 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
1b2e0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1b2f0 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  Cmp(pShmNode->zF
1b300 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  ilename, pNew->z
1b310 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62  Filename)==0 ) b
1b320 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1b330 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20  pShmNode ){.    
1b340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1b350 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  w);.  }else{.   
1b360 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77   pShmNode = pNew
1b370 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
1b380 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28      ((winFile*)(
1b390 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1b3a0 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  ))->h = INVALID_
1b3b0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20  HANDLE_VALUE;.  
1b3c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78    pShmNode->pNex
1b3d0 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  t = winShmNodeLi
1b3e0 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f  st;.    winShmNo
1b3f0 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64  deList = pShmNod
1b400 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  e;..    pShmNode
1b410 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
1b420 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
1b430 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
1b440 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
1b450 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1b460 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b470 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1b480 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1b490 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
1b4a0 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28     rc = winOpen(
1b4b0 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20  pDbFd->pVfs,.   
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
1b4d0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
1b4e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
1b4f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
1b500 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b520 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
1b530 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1b540 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
1b550 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  here */.        
1b560 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b570 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54  OPEN_WAL | SQLIT
1b580 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b590 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
1b5a0 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20  REATE,.         
1b5b0 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
1b5c0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1b5d0 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
1b5e0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1b5f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
1b600 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74  k to see if anot
1b610 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
1b620 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d  olding the dead-
1b630 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20  man switch..    
1b640 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63  ** If not, trunc
1b650 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
1b660 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20  zero length. .  
1b670 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e    */.    if( win
1b680 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1b690 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c  hmNode, _SHM_WRL
1b6a0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1b6b0 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   1)==SQLITE_OK )
1b6c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1b6d0 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
1b6e0 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1b6f0 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20  de->hFile, 0);. 
1b700 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b720 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1b730 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1b740 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61  SHMOPEN, osGetLa
1b750 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
1b780 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1b790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b7a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b7b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
1b7c0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1b7d0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
1b7e0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1b7f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
1b800 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1b810 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1b820 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
1b830 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
1b840 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1b850 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1b860 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
1b870 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
1b880 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
1b890 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1b8a0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
1b8b0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
1b8c0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
1b8d0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
1b8e0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
1b8f0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
1b900 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
1b910 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
1b920 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1b930 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
1b940 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
1b950 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
1b960 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
1b970 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
1b980 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
1b990 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1b9a0 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
1b9b0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
1b9c0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
1b9d0 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
1b9e0 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
1b9f0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
1ba00 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
1ba10 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
1ba20 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
1ba30 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
1ba40 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
1ba50 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
1ba60 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
1ba70 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
1ba80 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
1ba90 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
1baa0 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
1bab0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1bac0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1bad0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
1bae0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
1baf0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
1bb00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
1bb10 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
1bb20 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1bb30 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1bb40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1bb50 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
1bb60 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
1bb70 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
1bb80 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1bb90 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
1bba0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
1bbb0 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
1bbc0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1bbd0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
1bbe0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
1bbf0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
1bc00 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1bc10 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
1bc20 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1bc30 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1bc40 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
1bc50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1bc60 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1bc70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
1bc80 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
1bc90 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
1bca0 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
1bcb0 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
1bcc0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
1bcd0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
1bce0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1bcf0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1bd00 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
1bd10 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
1bd20 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
1bd30 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
1bd40 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
1bd50 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
1bd60 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
1bd70 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1bd80 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
1bd90 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
1bda0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
1bdb0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1bdc0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
1bdd0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1bde0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
1bdf0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
1be00 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
1be10 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
1be20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1be30 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
1be40 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1be50 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
1be60 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
1be70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1be80 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1be90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bea0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
1beb0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
1bec0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
1bed0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
1bee0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
1bef0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
1bf00 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
1bf10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1bf20 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1bf30 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
1bf40 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
1bf50 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
1bf60 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
1bf70 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
1bf80 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
1bf90 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1bfa0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
1bfb0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
1bfc0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
1bfd0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1bfe0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1bff0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
1c000 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
1c010 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
1c020 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
1c030 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
1c040 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
1c050 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1c060 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
1c070 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
1c080 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
1c090 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
1c0a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1c0b0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
1c0c0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
1c0d0 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
1c0e0 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
1c0f0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
1c100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c110 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
1c120 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
1c130 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
1c140 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
1c150 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1c160 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
1c170 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1c180 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
1c190 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
1c1a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1c1b0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c1d0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
1c1e0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
1c1f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c210 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1c220 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
1c230 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
1c240 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
1c250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
1c260 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
1c270 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
1c280 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
1c290 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
1c2a0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1c2b0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
1c2c0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
1c2d0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
1c2e0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
1c2f0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
1c300 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
1c310 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
1c320 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c340 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1c350 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
1c360 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
1c370 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
1c380 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
1c390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1c3c0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3f0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
1c400 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
1c410 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
1c420 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
1c430 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
1c440 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1c450 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
1c460 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
1c470 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
1c480 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1c490 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1c4a0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
1c4b0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
1c4c0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
1c4d0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
1c4e0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
1c4f0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
1c500 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
1c510 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
1c520 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
1c530 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
1c540 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
1c550 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
1c560 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
1c570 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
1c580 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
1c590 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
1c5a0 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
1c5b0 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
1c5c0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
1c5d0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1c5e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1c5f0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
1c600 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1c610 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
1c620 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
1c630 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
1c640 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
1c650 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
1c660 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
1c670 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
1c680 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1c690 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1c6a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1c6b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
1c6c0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
1c6d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
1c6e0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
1c6f0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
1c700 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
1c710 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
1c720 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
1c730 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
1c740 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
1c750 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
1c760 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
1c770 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
1c780 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1c790 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1c7a0 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
1c7b0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1c7c0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
1c7d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c7e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
1c7f0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
1c800 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
1c810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1c830 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
1c840 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
1c850 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1c860 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
1c870 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1c880 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
1c890 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
1c8a0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
1c8b0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
1c8c0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
1c8d0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
1c8e0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
1c8f0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
1c900 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
1c910 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1c920 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
1c930 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
1c940 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
1c950 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1c960 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
1c970 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
1c980 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
1c990 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1c9a0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1c9b0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1c9c0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1c9d0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1c9e0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
1c9f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1ca00 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
1ca10 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ca20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
1ca30 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1ca40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1ca50 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
1ca60 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1ca70 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
1ca80 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1ca90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1caa0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
1cab0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1cac0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1cad0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1cae0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1caf0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1cb00 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
1cb10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1cb20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cb30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1cb40 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
1cb50 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
1cb60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1cb70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cb80 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
1cb90 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
1cba0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
1cbb0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
1cbc0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
1cbd0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
1cbe0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
1cbf0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
1cc00 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1cc10 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1cc20 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
1cc30 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1cc40 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1cc50 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1cc60 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1cc70 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1cc80 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
1cc90 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1cca0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ccb0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1ccc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ccd0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1cce0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
1ccf0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
1cd00 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
1cd10 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
1cd20 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
1cd30 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
1cd40 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
1cd50 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
1cd60 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1cd70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cd80 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1cd90 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1cda0 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73   _SHM_WRLCK, ofs
1cdb0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1cdc0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1cdd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cde0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1cdf0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
1ce00 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
1ce10 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1ce20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
1ce30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1ce40 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ce50 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1ce60 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1ce70 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c  HM-LOCK pid=%lu,
1ce80 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61   id=%d, sharedMa
1ce90 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73  sk=%03x, exclMas
1cea0 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22  k=%03x, rc=%s\n"
1ceb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1cec0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1ced0 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e  Id(), p->id, p->
1cee0 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
1cef0 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20  xclMask,.       
1cf00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61      sqlite3ErrNa
1cf10 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
1cf20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cf30 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
1cf40 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
1cf50 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
1cf60 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
1cf70 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
1cf80 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
1cf90 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
1cfa0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
1cfb0 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
1cfc0 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
1cfd0 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
1cfe0 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
1cff0 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
1d000 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
1d010 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
1d020 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1d030 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1d040 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
1d050 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1d060 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
1d070 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
1d080 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
1d090 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
1d0a0 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
1d0b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
1d0c0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1d0d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d0e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d0f0 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
1d100 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
1d110 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
1d120 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1d130 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1d140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d150 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
1d160 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
1d170 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1d180 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1d190 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
1d1a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
1d1b0 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
1d1c0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
1d1d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d1e0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1d1f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1d200 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
1d210 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
1d220 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
1d230 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
1d240 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
1d250 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
1d260 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
1d270 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1d280 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
1d290 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
1d2a0 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
1d2b0 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
1d2c0 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
1d2d0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
1d2e0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1d2f0 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
1d300 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
1d310 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
1d320 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
1d330 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
1d340 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
1d350 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
1d360 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
1d370 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
1d380 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
1d390 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1d3a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
1d3b0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
1d3c0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
1d3d0 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
1d3e0 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
1d3f0 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
1d400 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1d410 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
1d420 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
1d430 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
1d440 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1d450 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
1d460 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
1d470 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1d480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d490 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
1d4a0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d4c0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
1d4d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1d4e0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
1d510 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
1d520 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d540 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
1d550 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
1d560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d570 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
1d580 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
1d590 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
1d5a0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d5c0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
1d5d0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
1d5e0 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1d5f0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
1d600 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1d610 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
1d620 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
1d630 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d640 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
1d650 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
1d660 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
1d670 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
1d680 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1d690 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
1d6a0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1d6b0 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
1d6c0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
1d6d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1d6e0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1d6f0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
1d700 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
1d710 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
1d720 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1d730 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
1d740 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
1d750 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
1d760 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
1d770 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
1d780 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
1d790 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
1d7a0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
1d7b0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
1d7c0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
1d7d0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1d7e0 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
1d7f0 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
1d800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d810 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
1d820 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
1d830 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
1d840 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
1d850 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
1d860 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1d870 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
1d880 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1d890 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1d8a0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
1d8b0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
1d8c0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1d8d0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
1d8e0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
1d8f0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
1d900 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
1d910 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1d920 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
1d930 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
1d940 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
1d950 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1d960 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
1d970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d980 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
1d990 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1d9a0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
1d9b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1d9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d9d0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1d9e0 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap1", pDbFd->zPa
1d9f0 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  th);.      goto 
1da00 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1da10 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e   }..    if( sz<n
1da20 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Byte ){.      /*
1da30 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
1da40 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
1da50 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
1da60 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74  isWrite is set t
1da70 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c  o.      ** zero,
1da80 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
1da90 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
1daa0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
1dab0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
1dac0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
1dad0 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
1dae0 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
1daf0 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63  zero, use ftrunc
1db00 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
1db10 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
1db20 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1db30 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  region..      */
1db40 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72  .      if( !isWr
1db50 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  ite ) goto shmpa
1db60 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63  ge_out;.      rc
1db70 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1db80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1db90 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1dba0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
1dbb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1dbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1dbd0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1dbe0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
1dbf0 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
1dc00 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1dc20 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
1dc30 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1dc40 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1dc50 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1dc60 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
1dc70 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
1dc80 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
1dc90 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
1dca0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
1dcb0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
1dcc0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
1dcd0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
1dce0 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
1dcf0 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
1dd00 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
1dd10 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
1dd20 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
1dd30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1dd40 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1dd50 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1dd60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
1dd70 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1dd80 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
1dd90 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
1dda0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
1ddb0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
1ddc0 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c  ANDLE hMap = NUL
1ddd0 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  L;         /* fi
1dde0 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
1ddf0 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
1de00 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
1de10 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
1de20 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
1de30 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49  /.     .#if SQLI
1de40 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1de50 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1de60 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1de70 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  App(pShmNode->hF
1de80 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
1de90 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1dea0 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55  WRITE, nByte, NU
1deb0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
1dec0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ded0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1dee0 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1def0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1df00 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gW(pShmNode->hFi
1df10 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
1df20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1df30 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
1df40 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1df50 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1df60 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1df70 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  SI).      hMap =
1df80 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1df90 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingA(pShmNode->
1dfa0 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20  hFile.h, .      
1dfb0 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1dfc0 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
1dfd0 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
1dfe0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
1dff0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1e000 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
1e010 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65   region=%d, size
1e020 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1e040 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1e050 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
1e060 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c  >nRegion, nByte,
1e070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e080 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  hMap ? "ok" : "f
1e090 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1e0a0 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
1e0b0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
1e0c0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  = pShmNode->nReg
1e0d0 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
1e0e0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
1e0f0 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
1e100 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1e110 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
1e120 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54  arity;.#if SQLIT
1e130 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
1e140 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
1e150 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
1e160 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1e170 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1e180 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1e190 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66     iOffset - iOf
1e1a0 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
1e1b0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
1e1c0 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
1e1d0 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70  lse.        pMap
1e1e0 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1e1f0 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  le(hMap, FILE_MA
1e200 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
1e210 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
1e220 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20       0, iOffset 
1e230 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
1e240 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
1e250 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
1e260 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1e270 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1e280 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  MAP-MAP pid=%lu,
1e290 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73   region=%d, offs
1e2a0 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20  et=%d, size=%d, 
1e2b0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1e2c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1e2d0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1e2e0 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
1e2f0 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a  egion, iOffset,.
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20   szRegion, pMap 
1e320 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1e330 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
1e340 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a     if( !pMap ){.
1e350 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
1e360 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1e370 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1e380 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1e390 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1e3a0 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53  IOERR_SHMMAP, pS
1e3b0 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
1e3c0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1e3e0 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d  ShmMap3", pDbFd-
1e3f0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
1e400 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c   if( hMap ) osCl
1e410 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b  oseHandle(hMap);
1e420 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
1e430 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1e440 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   }..      pShmNo
1e450 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d  de->aRegion[pShm
1e460 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70  Node->nRegion].p
1e470 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20  Map = pMap;.    
1e480 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1e490 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
1e4a0 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d  egion].hMap = hM
1e4b0 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ap;.      pShmNo
1e4c0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20  de->nRegion++;. 
1e4d0 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67     }.  }..shmpag
1e4e0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68  e_out:.  if( pSh
1e4f0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69  mNode->nRegion>i
1e500 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e  Region ){.    in
1e510 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67  t iOffset = iReg
1e520 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
1e530 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
1e540 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
1e550 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
1e560 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
1e570 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  y;.    char *p =
1e580 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64   (char *)pShmNod
1e590 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69  e->aRegion[iRegi
1e5a0 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70  on].pMap;.    *p
1e5b0 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69  p = (void *)&p[i
1e5c0 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20  OffsetShift];.  
1e5d0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d  }else{.    *pp =
1e5e0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1e5f0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1e600 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1e610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e620 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
1e630 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  inShmMap     0.#
1e640 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f   define winShmLo
1e650 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
1e660 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30   winShmBarrier 0
1e670 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1e680 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
1e690 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
1e6a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
1e6b0 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20  /*.** Cleans up 
1e6c0 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f  the mapped regio
1e6d0 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66 69  n of the specifi
1e6e0 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e  ed file, if any.
1e6f0 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
1e700 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73  AX_MMAP_SIZE>0.s
1e710 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d  tatic int winUnm
1e720 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  apfile(winFile *
1e730 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74  pFile){.  assert
1e740 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
1e750 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d  OSTRACE(("UNMAP-
1e760 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1e770 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c  ile=%p, hMap=%p,
1e780 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
1e790 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d  ".           "mm
1e7a0 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61  apSize=%lld, mma
1e7b0 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64  pSizeActual=%lld
1e7c0 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c  , mmapSizeMax=%l
1e7d0 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  ld\n",.         
1e7e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1e7f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1e800 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70  , pFile->hMap, p
1e810 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1e830 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46  le->mmapSize, pF
1e840 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  ile->mmapSizeAct
1e850 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ual, pFile->mmap
1e860 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28  SizeMax));.  if(
1e870 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
1e880 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  on ){.    if( !o
1e890 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
1e8a0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1e8b0 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  on) ){.      pFi
1e8c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
1e8d0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1e8e0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1e8f0 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1e900 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1e910 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
1e920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e930 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  "rc=SQLITE_IOERR
1e940 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43  _MMAP\n", osGetC
1e950 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1e960 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20  ), pFile,.      
1e970 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
1e980 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20  pMapRegion));.  
1e990 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
1e9a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e9b0 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
1e9c0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9e0 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69       "winUnmapfi
1e9f0 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  le1", pFile->zPa
1ea00 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
1ea10 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1ea20 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
1ea30 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
1ea40 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1ea50 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20  zeActual = 0;.  
1ea60 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  }.  if( pFile->h
1ea70 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map!=NULL ){.   
1ea80 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e   if( !osCloseHan
1ea90 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29  dle(pFile->hMap)
1eaa0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1eab0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1eac0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1ead0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
1eae0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1eaf0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61  u, pFile=%p, hMa
1eb00 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  p=%p, rc=SQLITE_
1eb10 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20  IOERR_MMAP\n",. 
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1eb30 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1eb40 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
1eb50 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20  ile->hMap));.   
1eb60 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
1eb70 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1eb80 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
1eb90 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c      "winUnmapfil
1ebc0 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
1ebd0 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
1ebe0 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
1ebf0 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  ;.  }.  OSTRACE(
1ec00 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
1ec10 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1ec20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1ec30 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1ec40 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ec50 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20  d(), pFile));.  
1ec60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ec70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72  ;.}../*.** Memor
1ec80 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74  y map or remap t
1ec90 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62  he file opened b
1eca0 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  y file-descripto
1ecb0 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66 69  r pFd (if the fi
1ecc0 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  le.** is already
1ecd0 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78 69   mapped, the exi
1ece0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
1ecf0 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
1ed00 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a   new). Or, if .*
1ed10 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
1ed20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
1ed30 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
1ed40 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
1ed50 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64  ill .** outstand
1ed60 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66  ing xFetch() ref
1ed70 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74  erences to it, t
1ed80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ed90 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1eda0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74  f parameter nByt
1edb0 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  e is non-negativ
1edc0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  e, then it is th
1edd0 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
1ede0 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70   of .** the mapp
1edf0 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
1ee00 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
1ee10 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
1ee20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a  zero, then the .
1ee30 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  ** requested siz
1ee40 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  e is the size of
1ee50 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1ee60 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69  k. The actual si
1ee70 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65  ze of the.** cre
1ee80 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20  ated mapping is 
1ee90 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65  either the reque
1eea0 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65  sted size or the
1eeb0 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
1eec0 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49  d .** using SQLI
1eed0 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
1eee0 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ZE, whichever is
1eef0 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   smaller..**.** 
1ef00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1ef10 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
1ef20 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69  r occurs (even i
1ef30 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  f the mapping is
1ef40 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65   not.** recreate
1ef50 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  d as a result of
1ef60 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1ef70 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53  erences) or an S
1ef80 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1ef90 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1efa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1efb0 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  Mapfile(winFile 
1efc0 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e  *pFd, sqlite3_in
1efd0 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71  t64 nByte){.  sq
1efe0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70  lite3_int64 nMap
1eff0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20   = nByte;.  int 
1f000 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1f010 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e  Map>=0 || pFd->n
1f020 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
1f030 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1f040 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1f050 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
1f060 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f070 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f080 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42  essId(), pFd, nB
1f090 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46  yte));..  if( pF
1f0a0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29  d->nFetchOut>0 )
1f0b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f0c0 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30  K;..  if( nMap<0
1f0d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
1f0e0 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65  FileSize((sqlite
1f0f0 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d  3_file*)pFd, &nM
1f100 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ap);.    if( rc 
1f110 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
1f120 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
1f130 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1f140 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  c=SQLITE_IOERR_F
1f150 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20  STAT\n",.       
1f160 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f170 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f180 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65   pFd));.      re
1f190 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1f1a0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
1f1b0 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46   }.  if( nMap>pF
1f1c0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
1f1d0 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64  {.    nMap = pFd
1f1e0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1f1f0 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73   }.  nMap &= ~(s
1f200 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69  qlite3_int64)(wi
1f210 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
1f220 69 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69 66  ize - 1);. .  if
1f230 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46 64  ( nMap==0 && pFd
1f240 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
1f250 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65      winUnmapfile
1f260 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pFd);.  }.  if(
1f270 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
1f280 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69 64  Size ){.    void
1f290 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
1f2a0 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d 20  DWORD protect = 
1f2b0 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  PAGE_READONLY;. 
1f2c0 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d     DWORD flags =
1f2d0 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a   FILE_MAP_READ;.
1f2e0 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
1f2f0 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28 20  e(pFd);.    if( 
1f300 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
1f310 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  & WINFILE_RDONLY
1f320 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  )==0 ){.      pr
1f330 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
1f340 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c  DWRITE;.      fl
1f350 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f  ags |= FILE_MAP_
1f360 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69 66  WRITE;.    }.#if
1f370 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1f380 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
1f390 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1f3a0 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d  pingFromApp(pFd-
1f3b0 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1f3c0 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a  t, nMap, NULL);.
1f3d0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1f3e0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
1f3f0 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d  IDE).    pFd->hM
1f400 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1f410 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68  eMappingW(pFd->h
1f420 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
1f430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e   (DWORD)((nMap>>
1f460 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66  32) & 0xffffffff
1f470 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f490 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20     (DWORD)(nMap 
1f4a0 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e  & 0xffffffff), N
1f4b0 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  ULL);.#elif defi
1f4c0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1f4d0 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 70  _HAS_ANSI).    p
1f4e0 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65  Fd->hMap = osCre
1f4f0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
1f500 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
1f510 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  otect,.         
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28         (DWORD)((
1f540 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66  nMap>>32) & 0xff
1f550 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20  ffffff),.       
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f570 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1f580 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66  (nMap & 0xffffff
1f590 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ff), NULL);.#end
1f5a0 69 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  if.    if( pFd->
1f5b0 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  hMap==NULL ){.  
1f5c0 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
1f5d0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1f5e0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
1f5f0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1f600 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
1f610 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
1f620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f630 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
1f640 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74  ile1", pFd->zPat
1f650 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
1f660 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
1f670 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
1f680 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
1f690 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
1f6a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1f6b0 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20  MAP-FILE-CREATE 
1f6c0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1f6d0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1f6f0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1f700 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
1f710 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1f720 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f730 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f740 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20    assert( (nMap 
1f750 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  % winSysInfo.dwP
1f760 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20  ageSize)==0 );. 
1f770 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
1f780 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f  f(SIZE_T)==sizeo
1f790 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  f(sqlite3_int64)
1f7a0 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66   || nMap<=0xffff
1f7b0 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49  ffff );.#if SQLI
1f7c0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1f7d0 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
1f7e0 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46  OfFileFromApp(pF
1f7f0 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
1f800 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29  0, (SIZE_T)nMap)
1f810 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77  ;.#else.    pNew
1f820 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
1f830 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c  le(pFd->hMap, fl
1f840 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45  ags, 0, 0, (SIZE
1f850 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66  _T)nMap);.#endif
1f860 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  .    if( pNew==N
1f870 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43  ULL ){.      osC
1f880 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e  loseHandle(pFd->
1f890 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64  hMap);.      pFd
1f8a0 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
1f8b0 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72       pFd->lastEr
1f8c0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1f8d0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
1f8e0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1f8f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1f900 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , pFd->lastErrno
1f910 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f920 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70           "winMap
1f930 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61  file2", pFd->zPa
1f940 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f  th);.      /* Lo
1f950 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74  g the error, but
1f960 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c   continue normal
1f970 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67   operation using
1f980 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f   xRead/xWrite */
1f990 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1f9a0 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69  "MAP-FILE-MAP pi
1f9b0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1f9c0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1f9d0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1f9e0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1f9f0 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
1fa00 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1fa10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1fa20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1fa30 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
1fa40 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d  = pNew;.    pFd-
1fa50 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70  >mmapSize = nMap
1fa60 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
1fa70 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70  izeActual = nMap
1fa80 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
1fa90 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
1faa0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
1fab0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
1fac0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1fad0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1fae0 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74  (), pFd));.  ret
1faf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1fb00 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1fb10 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1fb20 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  0 */../*.** If p
1fb30 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20  ossible, return 
1fb40 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d  a pointer to a m
1fb50 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66  apping of file f
1fb60 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66  d starting at of
1fb70 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68  fset.** iOff. Th
1fb80 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62  e mapping must b
1fb90 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c  e valid for at l
1fba0 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e  east nAmt bytes.
1fbb0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
1fbc0 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20   pointer can be 
1fbd0 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20  obtained, store 
1fbe0 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65  it in *pp and re
1fbf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1fc00 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61  ** Or, if one ca
1fc10 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f  nnot but no erro
1fc20 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70  r occurs, set *p
1fc30 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  p to 0 and retur
1fc40 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
1fc50 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  Finally, if an e
1fc60 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
1fc70 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1fc80 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
1fc90 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  e final.** value
1fca0 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66   of *pp is undef
1fcb0 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
1fcc0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e..**.** If this
1fcd0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72   function does r
1fce0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c  eturn a pointer,
1fcf0 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
1fd00 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20   eventually .** 
1fd10 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
1fd20 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
1fd30 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a   winUnfetch()..*
1fd40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1fd50 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69  Fetch(sqlite3_fi
1fd60 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66  le *fd, i64 iOff
1fd70 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64  , int nAmt, void
1fd80 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49   **pp){.#if SQLI
1fd90 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1fda0 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
1fdb0 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
1fdc0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1fdd0 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
1fde0 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
1fdf0 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  *pp = 0;..  OSTR
1fe00 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
1fe10 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
1fe20 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75  ffset=%lld, amou
1fe30 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c  nt=%d, pp=%p\n",
1fe40 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1fe50 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1fe60 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e  d(), fd, iOff, n
1fe70 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20  Amt, pp));..#if 
1fe80 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1fe90 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
1fea0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
1feb0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
1fec0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
1fed0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1fee0 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20  winMapfile(pFd, 
1fef0 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  -1);.      if( r
1ff00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ff10 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1ff20 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  ("FETCH pid=%lu,
1ff30 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
1ff40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ff50 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1ff60 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1ff70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
1ff80 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1ff90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ffa0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1ffb0 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
1ffc0 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b   >= iOff+nAmt ){
1ffd0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28  .      *pp = &((
1ffe0 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
1fff0 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20  gion)[iOff];.   
20000 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
20010 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  t++;.    }.  }.#
20020 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
20030 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
20040 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25  , pFile=%p, pp=%
20050 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51  p, *pp=%p, rc=SQ
20060 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
20070 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20080 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20090 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20  fd, pp, *pp));. 
200a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
200b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
200c0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
200d0 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
200e0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
200f0 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a  n releases a .**
20100 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
20110 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
20120 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74  r call to winFet
20130 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
20140 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
20150 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
20160 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
20170 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
20180 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
20190 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
201a0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
201b0 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  nFetch() invocat
201c0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ion. .**.** Or, 
201d0 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  if the third arg
201e0 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74  ument is NULL, t
201f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
20200 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  n is being calle
20210 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  d .** to inform 
20220 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
20230 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
20240 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
20250 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a  ting mapping .**
20260 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61   may now be inva
20270 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62  lid and should b
20280 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73  e unmapped..*/.s
20290 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66  tatic int winUnf
202a0 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
202b0 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
202c0 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53   void *p){.#if S
202d0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
202e0 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20  IZE>0.  winFile 
202f0 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  *pFd = (winFile*
20300 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
20310 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
20320 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e file */..  /* 
20330 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74  If p==0 (unmap t
20340 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20  he entire file) 
20350 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
20360 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
20370 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72  g .  ** xFetch r
20380 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69  eferences. Or, i
20390 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20  f p!=0 (meaning 
203a0 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20  it is an xFetch 
203b0 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a  reference),.  **
203c0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
203d0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
203e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a   outstanding.  *
203f0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d  /.  assert( (p==
20400 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68  0)==(pFd->nFetch
20410 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Out==0) );..  /*
20420 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73   If p!=0, it mus
20430 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66  t match the iOff
20440 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73   value. */.  ass
20450 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d  ert( p==0 || p==
20460 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
20470 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29  pRegion)[iOff] )
20480 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  ;..  OSTRACE(("U
20490 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  NFETCH pid=%lu, 
204a0 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74  pFile=%p, offset
204b0 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a  =%lld, p=%p\n",.
204c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
204d0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
204e0 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70  (), pFd, iOff, p
204f0 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a  ));..  if( p ){.
20500 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
20510 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ut--;.  }else{. 
20520 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66     /* FIXME:  If
20530 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61   Windows truly a
20540 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73 20 74  lways prevents t
20550 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c  runcating or del
20560 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  eting a.    ** f
20570 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70  ile while a mapp
20580 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65  ing is held, the
20590 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
205a0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63  winUnmapfile() c
205b0 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e  all.    ** is un
205c0 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20 63 61  necessary can ca
205d0 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70  n be omitted - p
205e0 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f  otentially impro
205f0 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66  ving.    ** perf
20600 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20  ormance.  */.   
20610 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
20620 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
20630 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
20640 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  t>=0 );.#endif..
20650 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
20660 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
20670 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
20680 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
20690 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
206a0 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29 29  rocessId(), fd))
206b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
206c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
206d0 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
206e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
206f0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
20700 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
20710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20720 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
20730 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
20740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
20760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
207a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
207b0 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
207c0 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
207d0 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
207e0 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
207f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
20800 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
20810 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
20820 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
20830 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c  oMethod = {.  3,
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20860 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
20870 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  inClose,        
20880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20890 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69  * xClose */.  wi
208a0 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  nRead,          
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
208c0 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57   xRead */.  winW
208d0 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
208e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
208f0 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72  Write */.  winTr
20900 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
20910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
20920 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e  runcate */.  win
20930 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20950 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69  xSync */.  winFi
20960 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
20970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
20980 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  ileSize */.  win
20990 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209b0 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e  xLock */.  winUn
209c0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
209d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
209e0 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68  nlock */.  winCh
209f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
20a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
20a10 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
20a20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e   */.  winFileCon
20a30 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
20a40 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
20a50 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65  ntrol */.  winSe
20a60 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
20a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
20a80 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77  ectorSize */.  w
20a90 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
20aa0 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f  ristics,       /
20ab0 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
20ac0 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69  eristics */.  wi
20ad0 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20af0 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69   xShmMap */.  wi
20b00 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  nShmLock,       
20b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20b20 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77   xShmLock */.  w
20b30 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  inShmBarrier,   
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b50 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
20b60 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20  .  winShmUnmap, 
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
20b90 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20  */.  winFetch,  
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
20bc0 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20  /.  winUnfetch  
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
20bf0 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  */.};../********
20c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c40 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
20c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c60 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
20c70 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
20c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c90 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
20ca0 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
20cb0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
20cc0 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
20cd0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
20ce0 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
20cf0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
20d00 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f  GWIN__)./*.** Co
20d10 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65  nvert a filename
20d20 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74   from whatever t
20d30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
20d40 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a  erating system.*
20d50 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66  * supports for f
20d60 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54  ilenames into UT
20d70 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
20d80 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20 69  old the result i
20d90 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
20da0 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
20db0 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
20dc0 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
20dd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
20de0 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54  har *winConvertT
20df0 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  oUtf8Filename(co
20e00 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
20e10 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  ame){.  char *zC
20e20 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
20e30 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
20e40 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
20e50 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
20e60 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  8(zFilename);.  
20e70 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
20e80 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
20e90 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76   else{.    zConv
20ea0 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f  erted = sqlite3_
20eb0 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
20ec0 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  f8(zFilename);. 
20ed0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63   }.#endif.  /* c
20ee0 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c  aller will handl
20ef0 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  e out of memory 
20f00 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e  */.  return zCon
20f10 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66  verted;.}.#endif
20f20 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
20f30 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65  a UTF-8 filename
20f40 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
20f50 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  orm the underlyi
20f60 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  ng.** operating 
20f70 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c  system wants fil
20f80 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63  enames in.  Spac
20f90 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
20fa0 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69  sult.** is obtai
20fb0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
20fc0 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
20fd0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
20fe0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
20ff0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
21000 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
21010 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
21020 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
21030 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
21040 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f  ted = 0;.  if( o
21050 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a  sIsNT() ){.    z
21060 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55  Converted = winU
21070 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
21080 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66  lename);.  }.#if
21090 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
210a0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
210b0 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
210c0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
210d0 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46  _utf8_to_mbcs(zF
210e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  ilename);.  }.#e
210f0 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72  ndif.  /* caller
21100 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74   will handle out
21110 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
21120 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65  return zConverte
21130 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  d;.}../*.** This
21140 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
21150 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
21160 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46 2d  e specified UTF-
21170 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a  8 string buffer.
21180 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20 64  ** ends with a d
21190 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
211a0 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f 72 20  or character or 
211b0 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73 73 66  one was successf
211c0 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f  ully.** added to
211d0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
211e0 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44  nt winMakeEndInD
211f0 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20  irSep(int nBuf, 
21200 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69  char *zBuf){.  i
21210 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69  f( zBuf ){.    i
21220 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65  nt nLen = sqlite
21230 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b  3Strlen30(zBuf);
21240 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20  .    if( nLen>0 
21250 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e  ){.      if( win
21260 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c  IsDirSep(zBuf[nL
21270 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  en-1]) ){.      
21280 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21290 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e    }else if( nLen
212a0 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  +1<nBuf ){.     
212b0 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20     zBuf[nLen] = 
212c0 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a  winGetDirSep();.
212d0 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65          zBuf[nLe
212e0 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  n+1] = '\0';.   
212f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21310 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
21320 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
21330 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
21340 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  me and store the
21350 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74   resulting point
21360 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a  er into pzBuf..*
21370 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
21380 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20  turned in pzBuf 
21390 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76 69  must be freed vi
213a0 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  a sqlite3_free()
213b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
213c0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73  winGetTempname(s
213d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
213e0 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b  , char **pzBuf){
213f0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
21400 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
21410 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
21420 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
21430 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
21440 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
21450 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
21460 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69  size_t i, j;.  i
21470 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65  nt nPre = sqlite
21480 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45  3Strlen30(SQLITE
21490 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
214a0 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20  X);.  int nMax, 
214b0 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e  nBuf, nDir, nLen
214c0 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ;.  char *zBuf;.
214d0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
214e0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
214f0 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
21500 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
21510 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
21520 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
21530 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
21540 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
21550 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
21560 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
21570 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
21580 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
21590 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
215a0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
215b0 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  te a temporary b
215c0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
215d0 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
215e0 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d  ed file.  ** nam
215f0 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  e for the tempor
21600 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ary file.  If th
21610 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e  is fails, we can
21620 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20  not continue..  
21630 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73  */.  nMax = pVfs
21640 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42  ->mxPathname; nB
21650 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20  uf = nMax + 2;. 
21660 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d   zBuf = sqlite3M
21670 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20  allocZero( nBuf 
21680 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29  );.  if( !zBuf )
21690 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
216a0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
216b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
216c0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  MEM\n"));.    re
216d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
216e0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  R_NOMEM;.  }..  
216f0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
21700 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d 70  e effective temp
21710 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
21720 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20 69    First, check i
21730 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62  f one.  ** has b
21740 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20 73  een explicitly s
21750 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69 63  et by the applic
21760 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65  ation; otherwise
21770 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20 20  , use the one.  
21780 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79  ** configured by
21790 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
217a0 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44  ystem..  */.  nD
217b0 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72  ir = nMax - (nPr
217c0 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65 72  e + 15);.  asser
217d0 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69  t( nDir>0 );.  i
217e0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  f( sqlite3_temp_
217f0 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
21800 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73   int nDirLen = s
21810 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
21820 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
21830 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20  ctory);.    if( 
21840 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20  nDirLen>0 ){.   
21850 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69 72     if( !winIsDir
21860 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  Sep(sqlite3_temp
21870 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c  _directory[nDirL
21880 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  en-1]) ){.      
21890 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20    nDirLen++;.   
218a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
218b0 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20  DirLen>nDir ){. 
218c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
218d0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
218e0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
218f0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
21900 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
21910 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21920 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
21930 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77 69  TE_ERROR, 0, "wi
21940 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20  nGetTempname1", 
21950 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
21960 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21970 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
21980 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
21990 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
219a0 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69    }.  }.#if defi
219b0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
219c0 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74    else{.    stat
219d0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
219e0 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
219f0 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
21a00 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
21a10 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
21a20 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
21a30 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
21a40 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29 20  * getenv("TMP") 
21a50 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
21a60 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20 2a  getenv("TEMP") *
21a70 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
21a80 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
21a90 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 22  LE") */.       "
21aa0 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
21ab0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
21ac0 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
21ad0 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20 20      ".",.       
21ae0 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
21af0 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
21b00 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e     };.    unsign
21b10 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f  ed int i;.    co
21b20 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
21b30 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61 7a   0;..    if( !az
21b40 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72 73  Dirs[0] ) azDirs
21b50 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51  [0] = getenv("SQ
21b60 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20  LITE_TMPDIR");. 
21b70 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31     if( !azDirs[1
21b80 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
21b90 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
21ba0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
21bb0 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d  s[2] ) azDirs[2]
21bc0 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29   = getenv("TMP")
21bd0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
21be0 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d  s[3] ) azDirs[3]
21bf0 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22   = getenv("TEMP"
21c00 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
21c10 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b 34  rs[4] ) azDirs[4
21c20 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52  ] = getenv("USER
21c30 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20 66  PROFILE");.    f
21c40 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
21c50 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28  (azDirs)/sizeof(
21c60 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72  azDirs[0]); zDir
21c70 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20  =azDirs[i++]){. 
21c80 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76       void *zConv
21c90 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66 28  erted;.      if(
21ca0 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
21cb0 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66  nue;.      /* If
21cc0 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74 73   the path starts
21cd0 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c 65   with a drive le
21ce0 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  tter followed by
21cf0 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20   the colon.     
21d00 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 61   ** character, a
21d10 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72 65  ssume it is alre
21d20 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69 6e  ady a native Win
21d30 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77 69  32 path; otherwi
21d40 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  se,.      ** it 
21d50 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74 65  must be converte
21d60 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57 69  d to a native Wi
21d70 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68 65  n32 path via the
21d80 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20 20   Cygwin API.    
21d90 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75 73    ** prior to us
21da0 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  ing it..      */
21db0 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73  .      if( winIs
21dc0 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
21dd0 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20 20  lon(zDir) ){.   
21de0 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
21df0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
21e00 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69  Utf8Filename(zDi
21e10 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
21e20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
21e30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21e40 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
21e50 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
21e60 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21e70 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
21e80 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
21e90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21ea0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
21eb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21ec0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
21ed0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
21ee0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21ef0 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
21f00 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29  Buf, "%s", zDir)
21f10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
21f20 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
21f30 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
21f40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
21f50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21f60 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
21f70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21f80 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
21f90 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ed = sqlite3Mall
21fa0 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29  ocZero( nMax+1 )
21fb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
21fc0 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
21fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
21fe0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
21ff0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22000 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22010 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22020 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
22030 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22040 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
22050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22060 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
22070 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20  path(.          
22080 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f        osIsNT() ?
22090 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
220a0 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f  N_W : CCP_POSIX_
220b0 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a  TO_WIN_A, zDir,.
220c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220d0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78  zConverted, nMax
220e0 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  +1)<0 ){.       
220f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22100 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22120 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
22130 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
22140 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
22150 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
22160 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  VPATH\n"));.    
22170 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
22180 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
22190 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20  IOERR_CONVPATH, 
221a0 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221c0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
221d0 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44  etTempname2", zD
221e0 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ir);.        }. 
221f0 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73         if( winIs
22200 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
22210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
22220 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77  At this point, w
22230 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69  e know the candi
22240 64 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65  date directory e
22250 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64  xists and should
22260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
22270 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c   used.  However,
22280 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   we may need to 
22290 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69  convert the stri
222a0 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20  ng containing.  
222b0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e          ** its n
222c0 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28  ame into UTF-8 (
222d0 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54  i.e. if it is UT
222e0 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e  F-16 right now).
222f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
22300 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55          char *zU
22310 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
22320 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
22330 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
22340 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38        if( !zUtf8
22350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22360 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22370 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
22380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22390 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
223a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
223b0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
223c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
223d0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
223e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
223f0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22400 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
22410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
22420 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
22430 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
22440 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
22450 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
22460 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
22470 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
22480 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ed);.          b
22490 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
224a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
224b0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
224c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
224d0 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49 54    }.#elif !SQLIT
224e0 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
224f0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
22500 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f 73  _).  else if( os
22510 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  IsNT() ){.    ch
22520 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
22530 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61 74 68  LPWSTR zWidePath
22540 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
22550 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65 6f  Zero( nMax*sizeo
22560 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20 20  f(WCHAR) );.    
22570 69 66 28 20 21 7a 57 69 64 65 50 61 74 68 20 29  if( !zWidePath )
22580 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22590 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
225a0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
225b0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
225c0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
225d0 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
225e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
225f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
22600 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61   if( osGetTempPa
22610 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50  thW(nMax, zWideP
22620 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ath)==0 ){.     
22630 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
22640 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20  idePath);.      
22650 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
22660 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
22670 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
22680 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
22690 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
226a0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
226b0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
226c0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
226d0 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
226e0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
22710 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e2", 0);.    }. 
22720 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55     zMulti = winU
22730 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
22740 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  dePath);.    if(
22750 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20   zMulti ){.     
22760 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22770 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
22780 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  s", zMulti);.   
22790 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
227a0 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
227b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
227c0 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73  ePath);.    }els
227d0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
227e0 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29  _free(zWidePath)
227f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22800 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22810 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22820 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22830 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
22840 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
22850 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22860 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
22870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
22880 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
22890 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
228a0 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20  zUtf8;.    char 
228b0 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c  *zMbcsPath = sql
228c0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
228d0 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20  nMax );.    if( 
228e0 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20  !zMbcsPath ){.  
228f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22900 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
22910 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
22920 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
22930 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
22940 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22950 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22960 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
22970 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41 28   osGetTempPathA(
22980 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68 29  nMax, zMbcsPath)
22990 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
229a0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
229b0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
229c0 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
229d0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47  c=SQLITE_IOERR_G
229e0 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b  ETTEMPPATH\n"));
229f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
22a00 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22a10 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
22a20 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
22a30 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
22a50 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33 22  winGetTempname3"
22a60 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
22a70 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f  zUtf8 = sqlite3_
22a80 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
22a90 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
22aa0 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
22ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
22ac0 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75  printf(nMax, zBu
22ad0 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  f, "%s", zUtf8);
22ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22af0 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
22b00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
22b10 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
22b20 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
22b30 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22b40 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
22b50 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
22b60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22b70 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
22b80 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
22b90 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
22ba0 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20  _ANSI */.#endif 
22bb0 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  /* !SQLITE_OS_WI
22bc0 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  NRT */..  /*.  *
22bd0 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
22be0 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  sure the tempora
22bf0 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64  ry directory end
22c00 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70  s with an approp
22c10 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72  riate.  ** separ
22c20 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65  ator.  If it doe
22c30 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20  s not and there 
22c40 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70  is not enough sp
22c50 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a  ace left to add.
22c60 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a    ** one, fail..
22c70 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d    */.  if( !winM
22c80 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e  akeEndInDirSep(n
22c90 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a  Dir+1, zBuf) ){.
22ca0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22cb0 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
22cc0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22cd0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
22ce0 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
22cf0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
22d00 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
22d10 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
22d20 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e4", 0);.  }..  
22d30 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68  /*.  ** Check th
22d40 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
22d50 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
22d60 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
22d70 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
22d80 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f  * name in the fo
22d90 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a  llowing format:.
22da0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65    **.  **   "<te
22db0 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
22dc0 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58  y>/etilqs_XXXXXX
22dd0 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20  XXXXXXXXX\0\0". 
22de0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c   **.  ** If not,
22df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22e00 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65  RROR.  The numbe
22e10 72 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72  r 17 is used her
22e20 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  e in order to.  
22e30 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  ** account for t
22e40 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
22e50 20 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65   the 15 characte
22e60 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20  r random suffix 
22e70 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  and the.  ** two
22e80 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68   trailing NUL ch
22e90 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66  aracters.  The f
22ea0 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73  inal directory s
22eb0 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
22ec0 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  er.  ** has alre
22ed0 61 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20  ady added if it 
22ee0 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  was not already 
22ef0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  present..  */.  
22f00 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
22f10 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
22f20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65  if( (nLen + nPre
22f30 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b   + 17) > nBuf ){
22f40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22f50 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
22f60 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
22f70 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
22f80 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
22f90 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
22fa0 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
22fb0 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
22fc0 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me5", 0);.  }.. 
22fd0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
22fe0 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20  f(nBuf-16-nLen, 
22ff0 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54  zBuf+nLen, SQLIT
23000 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
23010 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69  IX);..  j = sqli
23020 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
23030 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
23040 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
23050 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
23060 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
23070 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
23080 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
23090 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
230a0 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
230b0 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
230c0 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
230d0 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
230e0 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75  ;.  *pzBuf = zBu
230f0 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  f;..  OSTRACE(("
23100 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61  TEMP-FILENAME na
23110 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
23120 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a  _OK\n", zBuf));.
23130 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23140 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
23150 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
23160 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
23170 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
23180 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
23190 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
231a0 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
231b0 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
231c0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
231d0 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
231e0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
231f0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
23200 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
23210 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
23220 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
23230 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
23240 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
23250 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49  rrno;..  if( osI
23260 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
23270 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
23280 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
23290 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
232a0 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
232b0 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
232c0 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
232d0 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
232e0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
232f0 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
23300 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
23310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23320 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
23330 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
23340 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23360 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
23370 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
23380 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
23390 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20  ){}.    if( !rc 
233a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
233b0 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61  0; /* Invalid na
233c0 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  me? */.    }.   
233d0 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
233e0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
233f0 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  es;.#if SQLITE_O
23400 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
23410 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
23420 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
23430 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
23440 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
23450 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74   }.  return (att
23460 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
23470 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
23480 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
23490 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a  UTE_DIRECTORY);.
234a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
234b0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
234c0 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
234d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
234e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ,        /* Used
234f0 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20   to get maximum 
23500 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68  path name length
23510 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
23520 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
23530 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
23540 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
23550 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
23560 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
23570 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
23580 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
23590 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
235a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
235b0 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
235c0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
235d0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
235e0 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
235f0 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
23600 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
23610 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
23620 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
23630 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
23640 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
23650 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
23660 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
23670 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
23680 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
23690 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
236a0 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
236b0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
236c0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
236d0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
236e0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
236f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23700 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
23710 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
23720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
23730 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
23740 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
23750 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
23760 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
23770 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
23780 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
23790 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
237a0 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
237b0 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
237c0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
237d0 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
237e0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
237f0 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
23800 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61  /.  char *zTmpna
23810 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74  me = 0; /* For t
23820 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
23830 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  e, if necessary.
23840 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
23850 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
23860 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
23870 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
23880 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
23890 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
238a0 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
238b0 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
238c0 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
238d0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
238e0 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
238f0 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
23900 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23910 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
23920 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
23930 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
23940 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23950 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
23960 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
23970 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23980 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
23990 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
239a0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
239b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
239c0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
239d0 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
239e0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
239f0 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
23a00 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
23a10 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
23a20 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
23a30 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
23a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
23a50 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
23a60 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23a70 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
23a80 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
23a90 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
23aa0 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a  AL.  ));.#endif.
23ab0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
23ac0 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65  N name=%s, pFile
23ad0 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%p, flags=%x, p
23ae0 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a  OutFlags=%p\n",.
23af0 20 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38             zUtf8
23b00 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c  Name, id, flags,
23b10 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20   pOutFlags));.. 
23b20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
23b30 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
23b40 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
23b50 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
23b60 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
23b70 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
23b80 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
23b90 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
23ba0 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
23bb0 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
23bc0 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
23bd0 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
23be0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
23bf0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
23c00 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
23c10 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
23c20 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
23c30 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
23c40 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
23c50 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
23c60 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
23c70 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
23c80 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
23c90 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
23ca0 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
23cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
23cc0 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
23cd0 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
23ce0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
23cf0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
23d00 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
23d10 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
23d20 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
23d30 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
23d40 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
23d50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
23d60 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
23d70 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
23d80 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
23d90 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
23da0 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
23db0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
23dc0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
23dd0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
23de0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
23df0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
23e00 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
23e10 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
23e20 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
23e30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
23e40 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
23e50 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
23e60 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
23e70 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
23e80 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
23e90 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
23ea0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
23eb0 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
23ec0 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
23ed0 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
23ee0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
23ef0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
23f00 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
23f10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
23f20 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
23f30 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
23f40 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
23f50 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23f60 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
23f70 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
23f80 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
23f90 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
23fa0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
23fb0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
23fc0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
23fd0 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
23fe0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
23ff0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
24000 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
24010 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
24020 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
24030 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
24040 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  !=0 );.  memset(
24050 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66  pFile, 0, sizeof
24060 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46  (winFile));.  pF
24070 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44  ile->h = INVALID
24080 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a  _HANDLE_VALUE;..
24090 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
240a0 4e 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38  NRT.  if( !zUtf8
240b0 4e 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33  Name && !sqlite3
240c0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
240d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
240e0 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  og(SQLITE_ERROR,
240f0 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65  .        "sqlite
24100 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
24110 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
24120 20 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52   be set for WinR
24130 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  T");.  }.#endif.
24140 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63  .  /* If the sec
24150 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
24160 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
24170 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20   NULL, generate 
24180 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  a .  ** temporar
24190 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75  y file name to u
241a0 73 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  se .  */.  if( !
241b0 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20  zUtf8Name ){.   
241c0 20 61 73 73 65 72 74 28 20 69 73 44 65 6c 65 74   assert( isDelet
241d0 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72  e && !isOpenJour
241e0 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  nal );.    rc = 
241f0 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
24200 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b  Vfs, &zTmpname);
24210 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24230 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
24240 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20  ame=%s, rc=%s", 
24250 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74  zUtf8Name, sqlit
24260 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
24270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66  ;.    }.    zUtf
24290 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65  8Name = zTmpname
242a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61  ;.  }..  /* Data
242b0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
242c0 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
242d0 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
242e0 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55  y are not.  ** U
242f0 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65 74  RIs with paramet
24300 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ers.  Hence, the
24310 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65 20  y can always be 
24320 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a  passed into.  **
24330 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
24340 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  ameter()..  */. 
24350 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65 21   assert( (eType!
24360 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
24370 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73 20  N_DB) || (flags 
24380 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
24390 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74  I) ||.       zUt
243a0 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  f8Name[sqlite3St
243b0 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65  rlen30(zUtf8Name
243c0 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  )+1]==0 );..  /*
243d0 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
243e0 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
243f0 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
24400 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
24410 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
24420 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38  f8Filename(zUtf8
24430 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  Name);.  if( zCo
24440 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
24450 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24460 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53  Tmpname);.    OS
24470 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
24480 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
24490 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55  IOERR_NOMEM", zU
244a0 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
244b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
244c0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
244d0 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43   if( winIsDir(zC
244e0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
244f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
24500 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73  onverted);.    s
24510 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
24520 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
24530 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
24540 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e  s, rc=SQLITE_CAN
24550 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55  TOPEN_ISDIR", zU
24560 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72  tf8Name));.    r
24570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
24580 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d  TOPEN_ISDIR;.  }
24590 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  ..  if( isReadWr
245a0 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73  ite ){.    dwDes
245b0 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e  iredAccess = GEN
245c0 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45  ERIC_READ | GENE
245d0 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c  RIC_WRITE;.  }el
245e0 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65  se{.    dwDesire
245f0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
24600 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f  C_READ;.  }..  /
24610 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  * SQLITE_OPEN_EX
24620 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20  CLUSIVE is used 
24630 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
24640 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  t a new file is 
24650 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53  .  ** created. S
24660 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73  QLite doesn't us
24670 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65  e it to indicate
24680 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63 65   "exclusive acce
24690 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74 20  ss" .  ** as it 
246a0 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72  is usually under
246b0 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stood..  */.  if
246c0 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ( isExclusive ){
246d0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20  .    /* Creates 
246e0 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79  a new file, only
246f0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
24700 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a  already exist. *
24710 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  /.    /* If the 
24720 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20  file exists, it 
24730 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77  fails. */.    dw
24740 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24750 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57  ion = CREATE_NEW
24760 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
24770 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
24780 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
24790 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
247a0 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
247b0 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  st */.    dwCrea
247c0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
247d0 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20  = OPEN_ALWAYS;. 
247e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
247f0 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c  pens a file, onl
24800 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  y if it exists. 
24810 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
24820 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
24830 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
24840 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65  }..  dwShareMode
24850 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
24860 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
24870 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73  WRITE;..  if( is
24880 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51  Delete ){.#if SQ
24890 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
248a0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
248b0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
248c0 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
248d0 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
248e0 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
248f0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
24900 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
24910 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
24940 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
24950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24970 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
24980 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
24990 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
249a0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
249b0 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
249c0 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
249d0 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
249e0 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
249f0 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
24a00 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
24a10 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
24a20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
24a30 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
24a40 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
24a50 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
24a60 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
24a70 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
24a80 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
24a90 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
24aa0 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
24ab0 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
24ac0 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41  S_WINRT.    CREA
24ad0 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
24ae0 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65  _PARAMETERS exte
24af0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a  ndedParameters;.
24b00 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
24b10 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20  meters.dwSize = 
24b20 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c  sizeof(CREATEFIL
24b30 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
24b40 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74  METERS);.    ext
24b50 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
24b60 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
24b70 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   =.            d
24b80 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24b90 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49  tes & FILE_ATTRI
24ba0 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  BUTE_MASK;.    e
24bb0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24bc0 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20  s.dwFileFlags = 
24bd0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
24be0 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47  utes & FILE_FLAG
24bf0 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
24c00 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
24c10 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73  SecurityQosFlags
24c20 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e   = SECURITY_ANON
24c30 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e  YMOUS;.    exten
24c40 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70  dedParameters.lp
24c50 53 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74  SecurityAttribut
24c60 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65  es = NULL;.    e
24c70 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24c80 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20  s.hTemplateFile 
24c90 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c  = NULL;.    whil
24ca0 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
24cb0 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a  File2((LPCWSTR)z
24cc0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
24cf0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d10 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
24d20 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
24d50 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d70 20 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65          &extende
24d80 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49  dParameters))==I
24d90 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
24da0 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
24dd0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
24de0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
24df0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
24e00 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  /.    }.#else.  
24e10 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
24e20 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43  CreateFileW((LPC
24e30 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
24e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24e60 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24e90 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
24ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24ec0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
24ed0 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
24f00 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d          NULL))==
24f30 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
24f40 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f60 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f        winRetryIo
24f70 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
24f80 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
24f90 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
24fa0 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
24fb0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
24fc0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
24fd0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69  .  else{.    whi
24fe0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
24ff0 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
25000 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
25030 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
25060 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25080 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
25090 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
250c0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
250d0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
25100 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
25110 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
25140 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
25150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25160 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
25170 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
25180 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 29  winLogIoerr(cnt)
25190 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
251a0 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d  PEN file=%p, nam
251b0 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78  e=%s, access=%lx
251c0 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a  , rc=%s\n", h, z
251d0 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20  Utf8Name,.      
251e0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
251f0 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49  cess, (h==INVALI
25200 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20  D_HANDLE_VALUE) 
25210 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
25220 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49  "));..  if( h==I
25230 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
25240 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LUE ){.    pFile
25250 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
25260 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
25270 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25280 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d  CANTOPEN, pFile-
25290 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e  >lastErrno, "win
252a0 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65  Open", zUtf8Name
252b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
252c0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
252d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
252e0 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
252f0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
25300 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
25310 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
25320 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
25330 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20  Name, id, .     
25340 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49      ((flags|SQLI
25350 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
25360 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) &.            
25370 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54           ~(SQLIT
25380 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
25390 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
253a0 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20  ITE)),.         
253b0 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
253c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
253d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
253e0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
253f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46    }..  if( pOutF
25400 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20  lags ){.    if( 
25410 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
25420 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
25430 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
25440 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  ADWRITE;.    }el
25450 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46  se{.      *pOutF
25460 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
25470 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
25480 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43   }.  }..  OSTRAC
25490 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70  E(("OPEN file=%p
254a0 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73  , name=%s, acces
254b0 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73  s=%lx, pOutFlags
254c0 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d  =%p, *pOutFlags=
254d0 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
254e0 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a   "rc=%s\n", h, z
254f0 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69  Utf8Name, dwDesi
25500 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46  redAccess, pOutF
25510 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20  lags, pOutFlags 
25520 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f  ?.           *pO
25530 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d  utFlags : 0, (h=
25540 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
25550 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64  VALUE) ? "failed
25560 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66  " : "ok"));..#if
25570 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
25580 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
25590 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c  te && eType==SQL
255a0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
255b0 0a 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d  .       && (rc =
255c0 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
255d0 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21  (zName, pFile))!
255e0 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a  =SQLITE_OK.  ){.
255f0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
25600 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(h);.    sqlite
25610 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25620 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
25630 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
25640 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
25650 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d  EN-CE-LOCK name=
25660 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e  %s, rc=%s\n", zN
25670 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
25680 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72  ame(rc)));.    r
25690 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
256a0 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20  if( isTemp ){.  
256b0 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65    pFile->zDelete
256c0 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65  OnClose = zConve
256d0 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  rted;.  }else.#e
256e0 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c  ndif.  {.    sql
256f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
25700 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  rted);.  }..  sq
25710 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
25720 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  ame);.  pFile->p
25730 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d  Method = &winIoM
25740 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e  ethod;.  pFile->
25750 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
25760 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69  File->h = h;.  i
25770 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b  f( isReadonly ){
25780 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
25790 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
257a0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  _RDONLY;.  }.  i
257b0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
257c0 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70  oolean(zName, "p
257d0 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
257e0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
257f0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
25800 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
25810 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
25820 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
25830 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20  o = NO_ERROR;.  
25840 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a  pFile->zPath = z
25850 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45  Name;.#if SQLITE
25860 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
25870 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d  .  pFile->hMap =
25880 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e   NULL;.  pFile->
25890 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
258a0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
258b0 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  e = 0;.  pFile->
258c0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
258d0 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
258e0 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
258f0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
25900 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20  zMmap;.#endif.. 
25910 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
25920 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25930 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
25940 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a  he named file..*
25950 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57  *.** Note that W
25960 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20  indows does not 
25970 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20  allow a file to 
25980 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f  be deleted if so
25990 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
259a0 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e  ess has it open.
259b0 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69    Sometimes a vi
259c0 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69  rus scanner or i
259d0 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a  ndexing program.
259e0 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a  ** will open a j
259f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72  ournal file shor
25a00 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20  tly after it is 
25a10 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72  created in order
25a20 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76   to do.** whatev
25a30 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69  er it does.  Whi
25a40 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72  le this other pr
25a50 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
25a60 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   the.** file ope
25a70 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e  n, we will be un
25a80 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69  able to delete i
25a90 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  t.  To work arou
25aa0 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c  nd this.** probl
25ab0 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30  em, we delay 100
25ac0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
25ad0 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20  d try to delete 
25ae0 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f  again.  Up.** to
25af0 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54   MX_DELETION_ATT
25b00 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61  EMPTs deletion a
25b10 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20  ttempts are run 
25b20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a  before giving.**
25b30 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e   up and returnin
25b40 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  g an error..*/.s
25b50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
25b60 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
25b70 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
25b80 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
25b90 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
25ba0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
25bb0 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  me,      /* Name
25bc0 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65   of file to dele
25bd0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63  te */.  int sync
25be0 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Dir             
25bf0 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
25c00 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20  on win32 */.){. 
25c10 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
25c20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20  int rc;.  DWORD 
25c30 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61  attr;.  DWORD la
25c40 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76  stErrno = 0;.  v
25c50 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
25c60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25c70 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55  TER(pVfs);.  UNU
25c80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79  SED_PARAMETER(sy
25c90 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c  ncDir);..  Simul
25ca0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
25cb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  n SQLITE_IOERR_D
25cc0 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43  ELETE);.  OSTRAC
25cd0 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
25ce0 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e  %s, syncDir=%d\n
25cf0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79  ", zFilename, sy
25d00 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e  ncDir));..  zCon
25d10 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
25d20 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
25d30 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
25d40 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
25d50 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
25d60 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
25d70 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
25d80 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
25d90 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
25da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25db0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
25dc0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
25dd0 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51  .    do {.#if SQ
25de0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
25df0 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
25e00 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
25e10 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d  ttrData;.      m
25e20 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
25e30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
25e40 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69  rData));.      i
25e50 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74  f ( osGetFileAtt
25e60 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76  ributesExW(zConv
25e70 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78  erted, GetFileEx
25e80 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25eb0 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20  &sAttrData) ){. 
25ec0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
25ed0 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
25ee0 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
25ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c  }else{.        l
25f00 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
25f10 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
25f20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
25f30 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
25f40 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
25f50 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
25f60 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
25f70 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
25f80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
25f90 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
25fa0 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
25fb0 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
25fc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
25fd0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
25fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25ff0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26000 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61   }.#else.      a
26010 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
26020 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76  ttributesW(zConv
26030 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
26040 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
26050 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
26060 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
26070 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
26080 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
26090 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
260a0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
260b0 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
260c0 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
260d0 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
260e0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
260f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26100 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
26110 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
26120 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
26130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26140 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26150 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
26160 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
26180 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
26190 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
261a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
261b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
261c0 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
261d0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
261e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
261f0 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28  ( osDeleteFileW(
26200 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
26210 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26220 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
26230 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
26240 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26250 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
26260 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
26270 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
26280 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26290 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
262a0 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
262b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
262c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
262d0 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64  ile(1);.  }.#ifd
262e0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
262f0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
26300 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
26310 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
26320 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
26330 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69  verted);.      i
26340 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
26350 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
26360 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
26370 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
26380 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
26390 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
263a0 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
263b0 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
263c0 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
263d0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
263e0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
263f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
26400 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
26410 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
26420 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
26430 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
26440 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
26450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26460 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
26470 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
26480 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
26490 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
264a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
264b0 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
264c0 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
264d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
264e0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
264f0 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
26500 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
26510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26520 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
26530 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
26540 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26550 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f  if ( !winRetryIo
26560 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26570 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
26580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26590 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72  OR; /* No more r
265a0 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20  etries. */.     
265b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
265c0 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29  }.    } while(1)
265d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
265e0 66 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c  f( rc && rc!=SQL
265f0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
26600 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63  _NOENT ){.    rc
26610 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
26620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
26630 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  TE, lastErrno, "
26640 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
26650 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
26660 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
26670 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  (cnt);.  }.  sql
26680 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
26690 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
266a0 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
266b0 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69  s, rc=%s\n", zFi
266c0 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  lename, sqlite3E
266d0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
266e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
266f0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
26700 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74  istence and stat
26710 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
26720 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
26730 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
26740 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
26750 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
26760 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
26770 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
26780 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
26790 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
267a0 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
267b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
267c0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
267d0 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
267e0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
267f0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
26800 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
26810 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
26820 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
26830 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
26840 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
26850 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
26860 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
26870 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
26880 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
26890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
268a0 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
268b0 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
268c0 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67  SS name=%s, flag
268d0 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70  s=%x, pResOut=%p
268e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
268f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73  zFilename, flags
26900 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20  , pResOut));..  
26910 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
26920 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
26930 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
26940 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
26950 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
26960 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
26970 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
26980 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
26990 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  ", zFilename));.
269a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
269b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
269c0 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
269d0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
269e0 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
269f0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
26a00 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
26a10 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
26a20 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
26a30 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
26a40 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
26a50 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
26a60 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
26a70 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a90 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
26aa0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
26ad0 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
26ae0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
26af0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
26b00 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
26b10 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53       /* For an S
26b20 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
26b30 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74  STS query, treat
26b40 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66   a zero-length f
26b50 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ile.      ** as 
26b60 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
26b70 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
26b80 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67       if(    flag
26b90 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
26ba0 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20  _EXISTS.        
26bb0 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
26bc0 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20  FileSizeHigh==0 
26bd0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
26be0 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
26bf0 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eLow==0 ){.     
26c00 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
26c10 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
26c20 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
26c30 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
26c40 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
26c50 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
26c60 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
26c70 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
26c80 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  cnt);.      if( 
26c90 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
26ca0 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _FILE_NOT_FOUND 
26cb0 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  && lastErrno!=ER
26cc0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
26cd0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ND ){.        sq
26ce0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
26cf0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
26d00 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
26d10 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
26d20 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e  ACCESS, lastErrn
26d30 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a  o, "winAccess",.
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 20 20 20 20 7a 46 69 6c 65             zFile
26d60 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
26d70 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
26d80 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
26d90 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
26da0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
26db0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
26dc0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
26dd0 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
26de0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
26df0 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
26e00 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
26e10 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
26e20 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
26e30 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
26e40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
26e50 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
26e60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
26e70 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
26e80 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
26e90 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
26ea0 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65  BUTES;.      bre
26eb0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
26ec0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
26ed0 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d  RITE:.      rc =
26ee0 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
26ef0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
26f00 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
26f10 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
26f20 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
26f30 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
26f40 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
26f50 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
26f60 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
26f70 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
26f80 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53  esOut = rc;.  OS
26f90 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
26fa0 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d  ame=%s, pResOut=
26fb0 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
26fc0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
26fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
26fe0 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c  lename, pResOut,
26ff0 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72   *pResOut));.  r
27000 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27020 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
27030 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
27040 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
27050 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72  h a drive letter
27060 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  .** followed by 
27070 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65  a colon characte
27080 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  r..*/.static BOO
27090 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  L winIsDriveLett
270a0 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f  erAndColon(.  co
270b0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  nst char *zPathn
270c0 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  ame.){.  return 
270d0 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  ( sqlite3Isalpha
270e0 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26  (zPathname[0]) &
270f0 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d  & zPathname[1]==
27100 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ':' );.}../*.** 
27110 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
27120 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
27130 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  d path name shou
27140 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61  ld be used verba
27150 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d  tim.  If.** non-
27160 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
27170 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
27180 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ion, the calling
27190 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73   function must s
271a0 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65  imply.** use the
271b0 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e   provided path n
271c0 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52  ame verbatim -OR
271d0 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74  - resolve it int
271e0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61  o a full path na
271f0 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  me.** using the 
27200 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20  GetFullPathName 
27210 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69  Win32 API functi
27220 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  on (if available
27230 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  )..*/.static BOO
27240 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50  L winIsVerbatimP
27250 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  athname(.  const
27260 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
27270 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  .){.  /*.  ** If
27280 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
27290 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72  tarts with a for
272a0 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20  ward slash or a 
272b0 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73  backslash, it is
272c0 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c   either.  ** a l
272d0 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61  egal UNC name, a
272e0 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
272f0 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73   path, or an abs
27300 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20  olute path name 
27310 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69  in the.  ** "Uni
27320 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e  x" format on Win
27330 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  dows.  There is 
27340 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64  no easy way to d
27350 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74  ifferentiate bet
27360 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69  ween.  ** the fi
27370 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74  nal two cases; t
27380 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74  herefore, we ret
27390 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65  urn the safer re
273a0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52  turn value of TR
273b0 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  UE.  ** so that 
273c0 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  callers of this 
273d0 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69  function will si
273e0 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62  mply use it verb
273f0 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  atim..  */.  if 
27400 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50  ( winIsDirSep(zP
27410 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20  athname[0]) ){. 
27420 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
27430 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
27440 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
27450 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65  starts with a le
27460 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e  tter and a colon
27470 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20   it is either a 
27480 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61  volume.  ** rela
27490 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20  tive path or an 
274a0 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20  absolute path.  
274b0 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  Callers of this 
274c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f  function must no
274d0 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74  t.  ** attempt t
274e0 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20  o treat it as a 
274f0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
27500 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68  me (i.e. they sh
27510 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a  ould simply use.
27520 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d    ** it verbatim
27530 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  )..  */.  if ( w
27540 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
27550 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d  ndColon(zPathnam
27560 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
27570 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
27580 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20  .  ** If we get 
27590 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
275a0 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  he path name sho
275b0 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61  uld almost certa
275c0 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79  inly be a purely
275d0 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f  .  ** relative o
275e0 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55  ne (i.e. not a U
275f0 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73  NC name, not abs
27600 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76  olute, and not v
27610 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e  olume relative).
27620 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46  .  */.  return F
27630 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALSE;.}../*.** T
27640 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
27650 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
27660 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57  ull pathname.  W
27670 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a  rite the full.**
27680 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a   pathname into z
27690 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77  Out[].  zOut[] w
276a0 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20  ill be at least 
276b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
276c0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
276d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
276e0 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
276f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
27700 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
27710 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
27720 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
27730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
27740 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a  ative,        /*
27750 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
27760 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
27770 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20  .  int nFull,   
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27790 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
277a0 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
277b0 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
277c0 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ull             
277d0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
277e0 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a  buffer */.){.  .
277f0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
27800 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
27810 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
27820 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
27830 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27840 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61  ETER(nFull);.  a
27850 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56  ssert( nFull>=pV
27860 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
27870 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
27880 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
27890 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
278a0 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
278b0 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
278c0 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
278d0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
278e0 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
278f0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
27900 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
27910 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
27920 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
27930 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
27940 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
27950 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
27960 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
27970 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
27980 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
27990 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
279a0 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
279b0 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
279c0 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   slash..    */. 
279d0 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
279e0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
279f0 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
27a00 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
27a10 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
27a20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
27a30 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
27a40 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
27a50 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
27a60 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
27a70 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
27a80 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
27a90 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20  X_TO_WIN_A) |.  
27aa0 20 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45            CCP_RE
27ab0 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76  LATIVE, zRelativ
27ac0 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
27ad0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
27ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
27af0 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
27b00 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
27b10 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
27b20 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
27b30 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b50 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
27b60 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74  thname1", zRelat
27b70 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
27b80 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
27b90 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
27ba0 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
27bb0 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
27bc0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
27bd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
27be0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
27bf0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27c00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
27c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
27c20 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
27c30 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27c40 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
27c50 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
27c60 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
27c70 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
27c80 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
27c90 70 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  p(), zUtf8);.   
27ca0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27cb0 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
27cc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
27cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
27ce0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  .    char *zOut 
27cf0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
27d00 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ero( pVfs->mxPat
27d10 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69  hname+1 );.    i
27d20 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20  f( !zOut ){.    
27d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
27d50 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
27d60 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
27d70 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
27d80 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
27d90 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
27da0 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20  SIX_TO_WIN_A),. 
27db0 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61             zRela
27dc0 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73  tive, zOut, pVfs
27dd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c  ->mxPathname+1)<
27de0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
27df0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
27e00 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
27e10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
27e20 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
27e30 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
27e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e50 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
27e60 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65  lPathname2", zRe
27e70 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c  lative);.    }el
27e80 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
27e90 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
27ea0 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
27eb0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (zOut);.      if
27ec0 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
27ed0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27ee0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
27ef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
27f00 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
27f10 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
27f20 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
27f30 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
27f40 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
27f50 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
27f60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27f70 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
27f80 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
27f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
27fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27fb0 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c  #endif..#if (SQL
27fc0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
27fd0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29  SQLITE_OS_WINRT)
27fe0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
27ff0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
28000 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
28010 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
28020 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61  );.  /* WinCE ha
28030 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20  s no concept of 
28040 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e  a relative pathn
28050 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20  ame, or so I am 
28060 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69  told. */.  /* Wi
28070 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74  nRT has no way t
28080 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61  o convert a rela
28090 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20  tive path to an 
280a0 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f  absolute one. */
280b0 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
280c0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
280d0 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
280e0 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
280f0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
28100 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
28110 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
28120 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
28130 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
28140 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
28150 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
28160 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
28170 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
28180 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
28190 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
281a0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
281b0 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
281c0 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
281d0 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
281e0 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
281f0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
28200 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a  backslash..    *
28210 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
28220 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
28230 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
28240 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25  me), zFull, "%s%
28250 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c%s",.          
28260 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28270 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
28280 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
28290 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ), zRelative);. 
282a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
282b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
282c0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
282d0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
282e0 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76  , "%s", zRelativ
282f0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
28300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
28310 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  if..#if !SQLITE_
28320 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
28330 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
28340 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
28350 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79  N__).  DWORD nBy
28360 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  te;.  void *zCon
28370 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a  verted;.  char *
28380 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  zOut;..  /* If t
28390 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65  his path name be
283a0 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c  gins with "/X:",
283b0 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e   where "X" is an
283c0 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a  y alphabetic.  *
283d0 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73  * character, dis
283e0 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c  card the initial
283f0 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61   "/" from the pa
28400 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  thname..  */.  i
28410 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
28420 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69  ='/' && winIsDri
28430 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
28440 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b  (zRelative+1) ){
28450 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b  .    zRelative++
28460 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73  ;.  }..  /* It's
28470 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
28480 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
28490 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
284a0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
284b0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
284c0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
284d0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
284e0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
284f0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
28500 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66   failing. This f
28510 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61  unction could fa
28520 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70  il if, for examp
28530 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72  le, the.  ** cur
28540 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72  rent working dir
28550 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
28560 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20  unlinked..  */. 
28570 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
28580 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
28590 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20  ERROR );.  if ( 
285a0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
285b0 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
285c0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
285d0 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
285e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
285f0 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
28600 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
28610 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
28620 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
28630 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
28640 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
28650 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
28660 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
28670 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
28680 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
28690 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
286a0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
286b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
286c0 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
286d0 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
286e0 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
286f0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
28700 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
28710 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
28720 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
28730 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
28760 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
28770 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
28780 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72  tive);.    retur
28790 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
287a0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
287b0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
287c0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
287d0 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
287e0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
287f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28800 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
28810 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
28820 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
28830 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
28840 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
28850 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
28860 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
28870 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
28880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28890 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
288a0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
288b0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
288c0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
288d0 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
288e0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28900 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
28910 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
28920 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ve);.    }.    n
28930 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
28940 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
28950 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
28960 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
28970 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
28980 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
28990 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
289a0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
289b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
289c0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
289d0 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
289e0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
289f0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
28a00 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
28a10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
28a20 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
28a30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28a40 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
28a50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
28a60 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
28a70 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
28a80 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
28a90 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
28aa0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
28ad0 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
28ae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
28af0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28b00 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
28b10 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
28b20 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
28b30 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
28b40 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
28b50 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
28b60 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
28b70 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
28b80 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
28b90 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
28ba0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
28bb0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
28bc0 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
28bd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28be0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
28bf0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
28c00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
28c10 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
28c20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
28c30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28c40 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
28c50 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a  ullPathname3", z
28c60 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
28c70 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
28c80 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
28c90 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
28ca0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
28cb0 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
28cc0 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
28cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28ce0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28cf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28d00 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
28d10 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
28d20 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
28d30 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
28d40 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
28d50 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
28d60 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
28d70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28d80 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
28d90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28da0 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
28db0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
28dc0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
28dd0 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
28de0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e00 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
28e10 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74  thname4", zRelat
28e20 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
28e30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28e40 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
28e50 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ut = sqlite3_win
28e60 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28  32_mbcs_to_utf8(
28e70 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69  zTemp);.    sqli
28e80 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
28e90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
28ea0 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71  ( zOut ){.    sq
28eb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
28ec0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
28ed0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
28ee0 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  ll, "%s", zOut);
28ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28f00 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74  e(zOut);.    ret
28f10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
28f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
28f30 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28f40 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
28f50 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f.}..#ifndef SQL
28f60 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
28f70 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e  TENSION./*.** In
28f80 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65  terfaces for ope
28f90 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69  ning a shared li
28fa0 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65  brary, finding e
28fb0 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77  ntry points.** w
28fc0 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64  ithin the shared
28fd0 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c   library, and cl
28fe0 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  osing the shared
28ff0 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61   library..*/.sta
29000 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f  tic void *winDlO
29010 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
29020 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61  *pVfs, const cha
29030 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
29040 20 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64   HANDLE h;.#if d
29050 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
29060 5f 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d  _).  int nFull =
29070 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29080 65 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75  e+1;.  char *zFu
29090 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ll = sqlite3Mall
290a0 6f 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b  ocZero( nFull );
290b0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
290c0 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  ted = 0;.  if( z
290d0 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  Full==0 ){.    O
290e0 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
290f0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
29100 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
29110 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
29120 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
29130 20 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74    if( winFullPat
29140 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
29150 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46  ename, nFull, zF
29160 75 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ull)!=SQLITE_OK 
29170 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
29180 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20  ree(zFull);.    
29190 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
291a0 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
291b0 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
291c0 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20  e, (void*)0));. 
291d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
291e0 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
291f0 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
29200 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c  f8Filename(zFull
29210 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
29220 65 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a  e(zFull);.#else.
29230 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
29240 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
29250 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
29260 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
29270 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
29280 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  Vfs);.#endif.  i
29290 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
292a0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
292b0 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  ("DLOPEN name=%s
292c0 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20  , handle=%p\n", 
292d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64  zFilename, (void
292e0 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72  *)0));.    retur
292f0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  n 0;.  }.  if( o
29300 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
29310 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
29320 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63     h = osLoadPac
29330 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50  kagedLibrary((LP
29340 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
29350 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
29360 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
29370 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  yW((LPCWSTR)zCon
29380 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
29390 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
293a0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
293b0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d  .  else{.    h =
293c0 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   osLoadLibraryA(
293d0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
293e0 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
293f0 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
29400 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
29410 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
29420 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a  me, (void*)h));.
29430 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
29440 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65  Converted);.  re
29450 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d  turn (void*)h;.}
29460 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
29470 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
29480 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
29490 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
294a0 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
294b0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
294c0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
294d0 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
294e0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
294f0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
29500 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
29510 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
29520 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20  ,void *pH,const 
29530 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
29540 64 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72  d){.  FARPROC pr
29550 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  oc;.  UNUSED_PAR
29560 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
29570 70 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63  proc = osGetProc
29580 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45  AddressA((HANDLE
29590 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53  )pH, zSym);.  OS
295a0 54 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61  TRACE(("DLSYM ha
295b0 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d  ndle=%p, symbol=
295c0 25 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e  %s, address=%p\n
295d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76  ",.           (v
295e0 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28  oid*)pH, zSym, (
295f0 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20  void*)proc));.  
29600 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
29610 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74  void))proc;.}.st
29620 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43  atic void winDlC
29630 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
29640 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48   *pVfs, void *pH
29650 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
29660 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
29670 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72  ;.  osFreeLibrar
29680 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  y((HANDLE)pHandl
29690 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  e);.  OSTRACE(("
296a0 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25  DLCLOSE handle=%
296b0 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61  p\n", (void*)pHa
296c0 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20  ndle));.}.#else 
296d0 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
296e0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
296f0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
29700 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f    #define winDlO
29710 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
29720 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20   winDlError 0.  
29730 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d  #define winDlSym
29740 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77     0.  #define w
29750 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64  inDlClose 0.#end
29760 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  if.../*.** Write
29770 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
29780 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
29790 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
297a0 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
297b0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
297c0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
297d0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
297e0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
297f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29800 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69  (pVfs);.#if defi
29810 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
29820 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d  .  n = nBuf;.  m
29830 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
29840 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
29850 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  ( sizeof(SYSTEMT
29860 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  IME)<=nBuf-n ){.
29870 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78      SYSTEMTIME x
29880 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65  ;.    osGetSyste
29890 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d  mTime(&x);.    m
298a0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
298b0 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
298c0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
298d0 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69  x);.  }.  if( si
298e0 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
298f0 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
29900 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
29910 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
29920 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
29930 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f  [n], &pid, sizeo
29940 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b  f(pid));.    n +
29950 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20  = sizeof(pid);. 
29960 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
29970 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a  _WINRT.  if( siz
29980 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d  eof(ULONGLONG)<=
29990 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c  nBuf-n ){.    UL
299a0 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73  ONGLONG cnt = os
299b0 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29  GetTickCount64()
299c0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
299d0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
299e0 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
299f0 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
29a00 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28  .  }.#else.  if(
29a10 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d   sizeof(DWORD)<=
29a20 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57  nBuf-n ){.    DW
29a30 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ORD cnt = osGetT
29a40 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
29a50 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
29a60 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e   &cnt, sizeof(cn
29a70 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  t));.    n += si
29a80 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23  zeof(cnt);.  }.#
29a90 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65  endif.  if( size
29aa0 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  of(LARGE_INTEGER
29ab0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
29ac0 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
29ad0 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
29ae0 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
29af0 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  &i);.    memcpy(
29b00 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69  &zBuf[n], &i, si
29b10 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20  zeof(i));.    n 
29b20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20  += sizeof(i);.  
29b30 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
29b40 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53  n n;.}.../*.** S
29b50 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
29b60 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
29b70 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
29b80 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74  ime slept..*/.st
29b90 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65  atic int winSlee
29ba0 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  p(sqlite3_vfs *p
29bb0 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  Vfs, int microse
29bc0 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69  c){.  sqlite3_wi
29bd0 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f  n32_sleep((micro
29be0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  sec+999)/1000);.
29bf0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
29c00 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
29c10 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39  rn ((microsec+99
29c20 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d  9)/1000)*1000;.}
29c30 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
29c40 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
29c50 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
29c60 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69  zero value, is i
29c70 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a  nterpreted as.**
29c80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
29c90 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
29ca0 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  0 and is used to
29cb0 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
29cc0 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43  of.** sqlite3OsC
29cd0 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72  urrentTime() dur
29ce0 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a  ing testing..*/.
29cf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
29d00 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  ST.int sqlite3_c
29d10 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b  urrent_time = 0;
29d20 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d    /* Fake system
29d30 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73   time in seconds
29d40 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a   since 1970. */.
29d50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69  #endif../*.** Fi
29d60 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
29d70 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
29d80 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
29d90 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  me).  Write into
29da0 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63   *piNow.** the c
29db0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
29dc0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
29dd0 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65   Day number time
29de0 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49  s 86_400_000.  I
29df0 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73  n.** other words
29e00 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69  , write into *pi
29e10 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Now the number o
29e20 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
29e30 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a  ince the Julian.
29e40 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e  ** epoch of noon
29e50 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e   in Greenwich on
29e60 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37   November 24, 47
29e70 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67  14 B.C according
29e80 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65   to the.** prole
29e90 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63  ptic Gregorian c
29ea0 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f  alendar..**.** O
29eb0 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72  n success, retur
29ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65  n SQLITE_OK.  Re
29ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29ee0 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  R if the time an
29ef0 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f  d date .** canno
29f00 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73  t be found..*/.s
29f10 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72  tatic int winCur
29f20 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71  rentTimeInt64(sq
29f30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29f40 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
29f50 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c  piNow){.  /* FIL
29f60 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20  ETIME structure 
29f70 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75  is a 64-bit valu
29f80 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  e representing t
29f90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20  he number of .  
29fa0 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e     100-nanosecon
29fb0 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63  d intervals sinc
29fc0 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30  e January 1, 160
29fd0 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e  1 (= JD 2305813.
29fe0 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45  5). .  */.  FILE
29ff0 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69  TIME ft;.  stati
2a000 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a010 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d  int64 winFiletim
2a020 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33  eEpoch = 2305813
2a030 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
2a040 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66  )8640000;.#ifdef
2a050 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
2a060 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a070 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
2a080 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
2a090 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
2a0a0 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20  40000;.#endif.  
2a0b0 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f  /* 2^32 - to avo
2a0c0 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64  id use of LL and
2a0d0 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63   warnings in gcc
2a0e0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
2a0f0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
2a100 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d   max32BitValue =
2a110 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33   .      (sqlite3
2a120 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
2a130 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
2a140 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a  64)2000000000 +.
2a150 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
2a160 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a  nt64)294967296;.
2a170 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2a180 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
2a190 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53  E time;.  osGetS
2a1a0 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29  ystemTime(&time)
2a1b0 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d  ;.  /* if System
2a1c0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29  TimeToFileTime()
2a1d0 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72   fails, it retur
2a1e0 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  ns zero. */.  if
2a1f0 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54   (!osSystemTimeT
2a200 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c  oFileTime(&time,
2a210 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72  &ft)){.    retur
2a220 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2a230 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65    }.#else.  osGe
2a240 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
2a250 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
2a260 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
2a270 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
2a280 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
2a290 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
2a2a0 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
2a2b0 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
2a2c0 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  ue) + .         
2a2d0 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
2a2e0 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74  nt64)ft.dwLowDat
2a2f0 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f  eTime)/(sqlite3_
2a300 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69  int64)10000;..#i
2a310 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2a320 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
2a330 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
2a340 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
2a350 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2a360 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2a370 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
2a380 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
2a390 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a3a0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
2a3b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2a3c0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
2a3d0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
2a3e0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
2a3f0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
2a400 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e the.** current
2a410 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
2a420 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
2a430 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f  umber into *prNo
2a440 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  w and.** return 
2a450 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  0.  Return 1 if 
2a460 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
2a470 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  e cannot be foun
2a480 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2a490 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28   winCurrentTime(
2a4a0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2a4b0 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  s, double *prNow
2a4c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2a4d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a  qlite3_int64 i;.
2a4e0 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e    rc = winCurren
2a4f0 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c  tTimeInt64(pVfs,
2a500 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20   &i);.  if( !rc 
2a510 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20  ){.    *prNow = 
2a520 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
2a530 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a540 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61  ../*.** The idea
2a550 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
2a560 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b  nction works lik
2a570 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  e a combination 
2a580 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  of.** GetLastErr
2a590 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d  or() and FormatM
2a5a0 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64  essage() on Wind
2a5b0 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e  ows (or errno an
2a5c0 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28  d.** strerror_r(
2a5d0 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65  ) on Unix). Afte
2a5e0 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  r an error is re
2a5f0 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a  turned by an OS.
2a600 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c  ** function, SQL
2a610 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66  ite calls this f
2a620 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75  unction with zBu
2a630 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a  f pointing to.**
2a640 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75   a buffer of nBu
2a650 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20  f bytes. The OS 
2a660 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70  layer should pop
2a670 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66  ulate the.** buf
2a680 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74  fer with a nul-t
2a690 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20  erminated UTF-8 
2a6a0 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65  encoded error me
2a6b0 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62  ssage.** describ
2a6c0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20  ing the last IO 
2a6d0 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63  error to have oc
2a6e0 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68  curred within th
2a6f0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72  e calling.** thr
2a700 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ead..**.** If th
2a710 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2a720 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72  is too large for
2a730 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
2a740 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75  ffer,.** it shou
2a750 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e  ld be truncated.
2a760 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
2a770 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72  e of xGetLastErr
2a780 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66  or.** is zero if
2a790 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
2a7a0 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62  ge fits in the b
2a7b0 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  uffer, or non-ze
2a7c0 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20  ro.** otherwise 
2a7d0 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20  (if the message 
2a7e0 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20  was truncated). 
2a7f0 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  If non-zero is r
2a800 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e  eturned,.** then
2a810 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
2a820 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20  sary to include 
2a830 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  the nul-terminat
2a840 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  or character.** 
2a850 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  in the output bu
2a860 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  ffer..**.** Not 
2a870 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72  supplying an err
2a880 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20  or message will 
2a890 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20  have no adverse 
2a8a0 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c  effect.** on SQL
2a8b0 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20  ite. It is fine 
2a8c0 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65  to have an imple
2a8d0 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e  mentation that n
2a8e0 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ever.** returns 
2a8f0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2a900 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47  :.**.**   int xG
2a910 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
2a920 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2a930 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2a940 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73  Buf){.**     ass
2a950 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30  ert(zBuf[0]=='\0
2a960 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72  ');.**     retur
2a970 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  n 0;.**   }.**.*
2a980 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20  * However if an 
2a990 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2a9a0 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69   supplied, it wi
2a9b0 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74  ll be incorporat
2a9c0 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20  ed.** by sqlite 
2a9d0 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  into the error m
2a9e0 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65  essage available
2a9f0 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69   to the user usi
2aa00 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72  ng.** sqlite3_er
2aa10 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79  rmsg(), possibly
2aa20 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72   making IO error
2aa30 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75  s easier to debu
2aa40 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2aa50 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2aa60 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2aa70 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
2aa80 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
2aa90 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2aaa0 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 69  fs);.  return wi
2aab0 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
2aac0 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
2aad0 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a  ), nBuf, zBuf);.
2aae0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2aaf0 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61  ize and deinitia
2ab00 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
2ab10 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
2ab20 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
2ab30 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
2ab40 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
2ab50 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
2ab60 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
2ab80 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
2ab90 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
2aba0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
2abb0 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
2abc0 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  N32_MAX_PATH_BYT
2abd0 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
2abe0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ac00 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
2ac10 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
2ac20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
2ac30 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2ac40 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2ac50 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2ac60 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2ac70 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2ac80 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2ac90 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
2aca0 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
2acb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2acc0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2acd0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2ace0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
2acf0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
2ad00 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2ad10 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2ad20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2ad30 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
2ad40 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
2ad50 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
2ad60 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
2ad70 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
2ad80 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2ad90 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2ada0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
2adb0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2adc0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2add0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
2ade0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
2adf0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
2ae00 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
2ae10 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
2ae20 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
2ae30 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
2ae40 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2ae50 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
2ae60 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2ae70 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2ae80 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
2ae90 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2aea0 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
2aeb0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
2aec0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2aed0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
2aee0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
2aef0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2af00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2af10 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2af20 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  ).  static sqlit
2af30 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61  e3_vfs winLongPa
2af40 74 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c  thVfs = {.    3,
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af60 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2af70 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
2af80 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a  File),     /* sz
2af90 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
2afa0 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
2afb0 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
2afc0 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2afd0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2afe0 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
2aff0 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67  .    "win32-long
2b000 70 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61  path",    /* zNa
2b010 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b030 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
2b040 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
2b050 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
2b060 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
2b070 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2b080 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2b090 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2b0a0 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
2b0b0 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
2b0c0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
2b0d0 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
2b0e0 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
2b0f0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
2b100 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
2b110 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
2b120 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
2b130 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
2b140 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
2b150 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
2b160 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
2b170 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
2b180 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
2b190 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2b1a0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
2b1b0 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ep,            /
2b1c0 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2b1d0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2b1e0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
2b1f0 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
2b200 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
2b210 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
2b220 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
2b230 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
2b240 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
2b250 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
2b260 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
2b270 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
2b280 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
2b290 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
2b2a0 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
2b2b0 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
2b2c0 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
2b2d0 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
2b2e0 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  .  };.#endif..  
2b2f0 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20  /* Double-check 
2b300 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c  that the aSyscal
2b310 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65  l[] array has be
2b320 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  en constructed. 
2b330 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20   ** correctly.  
2b340 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61  See ticket [bb3a
2b350 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a  86e890c8e96ab] *
2b360 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  /.  assert( Arra
2b370 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d  ySize(aSyscall)=
2b380 3d 37 36 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74  =76 );..  /* get
2b390 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
2b3a0 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
2b3b0 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
2b3c0 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
2b3d0 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
2b3e0 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  O));.#if SQLITE_
2b3f0 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74  OS_WINRT.  osGet
2b400 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
2b410 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
2b420 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
2b430 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
2b440 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  fo);.#endif.  as
2b450 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f  sert( winSysInfo
2b460 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
2b470 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20  nularity>0 );.  
2b480 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
2b490 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20  fo.dwPageSize>0 
2b4a0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  );..  sqlite3_vf
2b4b0 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56  s_register(&winV
2b4c0 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66  fs, 1);..#if def
2b4d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2b4e0 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71  2_HAS_WIDE).  sq
2b4f0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
2b500 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56  er(&winLongPathV
2b510 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a  fs, 0);.#endif..
2b520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b530 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  OK; .}..int sqli
2b540 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
2b550 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  { .#if SQLITE_OS
2b560 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65  _WINRT.  if( sle
2b570 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj!=NULL ){. 
2b580 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
2b590 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20  (sleepObj);.    
2b5a0 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
2b5b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
2b5c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b5d0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
2b5e0 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a        ITE_OS_WIN */.