/ Hex Artifact Content
Login

Artifact a5b9ed90eed522925135f1cc5f0e737a624a6b5c:


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 77 69  _WAL: {.      wi
18490 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
184a0 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
184b0 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
184c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
184d0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
184e0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
184f0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18510 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18520 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
18530 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
18540 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77  WRITE: {.      w
18550 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  inModeBit(pFile,
18560 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28   WINFILE_PSOW, (
18570 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
18580 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18590 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
185a0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
185b0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
185c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
185d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
185e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
185f0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
18600 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
18610 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
18620 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
18630 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53  zName);.      OS
18640 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18650 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18660 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18670 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
18680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18690 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
186a0 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56  E_FCNTL_WIN32_AV
186b0 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20  _RETRY: {.      
186c0 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70  int *a = (int*)p
186d0 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Arg;.      if( a
186e0 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [0]>0 ){.       
186f0 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d   winIoerrRetry =
18700 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[0];.      }el
18710 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d  se{.        a[0]
18720 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
18730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18740 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20  if( a[1]>0 ){.  
18750 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65        winIoerrRe
18760 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b  tryDelay = a[1];
18770 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18780 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e        a[1] = win
18790 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b  IoerrRetryDelay;
187a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
187b0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
187c0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
187d0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
187e0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
187f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18800 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
18810 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
18820 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
18830 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b  har *zTFile = 0;
18840 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
18850 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70  winGetTempname(p
18860 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46  File->pVfs, &zTF
18870 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
18880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18890 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
188a0 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b  *)pArg = zTFile;
188b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
188c0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
188d0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
188e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
188f0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
18900 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18910 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  c;.    }.#if SQL
18920 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
18930 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
18940 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
18950 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  IZE: {.      i64
18960 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36   newLimit = *(i6
18970 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  4*)pArg;.      i
18980 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18990 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  K;.      if( new
189a0 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
189b0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
189c0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
189d0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
189e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
189f0 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
18a00 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70   *(i64*)pArg = p
18a10 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
18a20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  x;.      if( new
18a30 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c  Limit>=0 && newL
18a40 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61  imit!=pFile->mma
18a50 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c  pSizeMax && pFil
18a60 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  e->nFetchOut==0 
18a70 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
18a80 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
18a90 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  newLimit;.      
18aa0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
18ab0 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
18ac0 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c       winUnmapfil
18ad0 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  e(pFile);.      
18ae0 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66      rc = winMapf
18af0 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a  ile(pFile, -1);.
18b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18b10 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
18b20 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18b30 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65   rc=%s\n", pFile
18b40 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ->h, sqlite3ErrN
18b50 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
18b60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18b70 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f  }.#endif.  }.  O
18b80 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18b90 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
18ba0 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70  E_NOTFOUND\n", p
18bb0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
18bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  urn SQLITE_NOTFO
18bd0 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  UND;.}../*.** Re
18be0 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
18bf0 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
18c00 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
18c10 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
18c20 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
18c30 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
18c40 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
18c50 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
18c60 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
18c70 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
18c80 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
18c90 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
18ca0 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
18cb0 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
18cc0 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
18cd0 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
18ce0 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
18cf0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
18d00 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
18d10 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
18d20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
18d30 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
18d40 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
18d50 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
18d60 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
18d70 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  nt winSectorSize
18d80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18d90 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a  d){.  (void)id;.
18da0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18db0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
18dc0 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  IZE;.}../*.** Re
18dd0 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66  turn a vector of
18de0 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
18df0 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74  ristics..*/.stat
18e00 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65  ic int winDevice
18e10 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
18e20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18e30 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20  ){.  winFile *p 
18e40 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
18e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18e60 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
18e70 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20  E_WHEN_OPEN |.  
18e80 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c         ((p->ctrl
18e90 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
18ea0 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43  PSOW)?SQLITE_IOC
18eb0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
18ec0 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a  RWRITE:0);.}../*
18ed0 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c   .** Windows wil
18ee0 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
18ef0 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
18f00 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
18f10 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
18f20 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
18f30 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
18f40 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
18f50 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
18f60 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
18f70 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
18f80 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  rity size..*/.st
18f90 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f  atic SYSTEM_INFO
18fa0 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
18fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18fc0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
18fd0 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
18fe0 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
18ff0 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
19000 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
19010 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
19020 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
19030 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
19040 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
19050 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
19060 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
19070 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
19080 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
19090 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
190a0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
190b0 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
190c0 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
190d0 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
190e0 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
190f0 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
19100 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
19110 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
19120 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
19130 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
19140 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
19150 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
19160 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
19170 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e  ld() );.**   win
19180 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a  ShmLeaveMutex().
19190 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
191a0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
191b0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
191c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
191d0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
191e0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
191f0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
19200 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
19210 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
19220 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
19230 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
19240 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
19250 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
19260 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 6e 64  ASTER));.}.#ifnd
19270 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
19280 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78   int winShmMutex
19290 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
192a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
192b0 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
192c0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
192d0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
192e0 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
192f0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  f../*.** Object 
19300 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
19310 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  t a single file 
19320 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70  opened and mmapp
19330 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a  ed to provide.**
19340 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
19350 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
19360 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
19370 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a  ence the same.**
19380 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61   log-summary, ea
19390 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74  ch thread has it
193a0 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62  s own winFile ob
193b0 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
193c0 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ll.** point to a
193d0 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
193e0 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e   of this object.
193f0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19400 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75  , each.** log-su
19410 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20  mmary is opened 
19420 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
19430 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e  ocess..**.** win
19440 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
19450 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
19460 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
19470 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
19480 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
19490 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
194a0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
194b0 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
194c0 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
194d0 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68   pNext .**.** Th
194e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
194f0 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
19500 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
19510 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
19520 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
19530 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
19540 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
19550 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
19560 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
19570 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
19580 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
19590 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
195a0 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
195b0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
195c0 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
195d0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
195e0 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
195f0 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
19600 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
19610 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
19620 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
19630 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
19640 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
19650 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19660 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
19670 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
19680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
19690 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
196a0 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
196b0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
196c0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
196d0 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
196e0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
196f0 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
19700 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
19710 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
19720 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
19730 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
19740 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
19750 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
19760 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
19770 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
19780 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
19790 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
197a0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
197b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
197c0 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
197d0 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
197e0 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
197f0 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
19800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
19810 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
19820 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
19830 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
19840 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
19850 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
19860 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
19870 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
19880 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
19890 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
198a0 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
198b0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
198c0 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66  bjects */.#ifdef
198d0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
198e0 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
198f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
19900 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e  xt available win
19910 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
19920 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
19930 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20   A global array 
19940 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
19950 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
19960 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78   The winShmMutex
19970 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
19980 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e  rue while readin
19990 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69  g or writing thi
199a0 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  s list..*/.stati
199b0 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69  c winShmNode *wi
199c0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30  nShmNodeList = 0
199d0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
199e0 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
199f0 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
19a00 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
19a10 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
19a20 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
19a30 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
19a40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
19a50 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
19a60 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
19a70 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
19a80 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
19a90 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
19aa0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53  r:.**.**    winS
19ab0 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20  hm.pShmNode.**  
19ac0 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a    winShm.id.**.*
19ad0 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
19ae0 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
19af0 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70  e.  The winShm.p
19b00 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d  ShmNode->mutex m
19b10 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
19b20 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
19b30 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
19b40 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
19b50 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68  winShm {.  winSh
19b60 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
19b70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
19b80 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  erlying winShmNo
19b90 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77  de object */.  w
19ba0 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  inShm *pNext;   
19bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
19bc0 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68  t winShm with th
19bd0 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64  e same winShmNod
19be0 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
19bf0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
19c00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
19c10 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e  ding the winShmN
19c20 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
19c30 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
19c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
19c50 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
19c60 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
19c70 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
19c80 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
19c90 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
19ca0 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66  s held */.#ifdef
19cb0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
19cc0 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
19cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
19ce0 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
19cf0 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
19d00 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
19d10 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
19d20 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
19d30 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
19d40 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
19d50 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
19d60 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
19d70 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
19d80 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
19d90 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
19da0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
19db0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
19dc0 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
19dd0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
19de0 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
19df0 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
19e00 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
19e10 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  st..*/.#define _
19e20 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
19e30 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
19e40 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
19e50 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
19e60 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
19e70 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
19e80 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
19e90 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
19ea0 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
19eb0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
19ec0 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
19ed0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
19ee0 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
19ef0 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
19f00 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
19f10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
19f20 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
19f30 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
19f40 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
19f50 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
19f60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19f70 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
19f80 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
19f90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
19fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19fb0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
19fc0 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
19fd0 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
19fe0 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
19ff0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1a000 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1a010 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1a020 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a030 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
1a040 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
1a050 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53  nRef==0 );..  OS
1a060 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1a070 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
1a080 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
1a090 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ze=%d\n",.      
1a0a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
1a0b0 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f  e.h, lockType, o
1a0c0 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20  fst, nByte));.. 
1a0d0 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
1a0e0 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
1a0f0 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
1a100 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
1a110 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
1a120 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  c = winUnlockFil
1a130 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
1a140 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  h, ofst, 0, nByt
1a150 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
1a160 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1a170 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
1a180 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
1a190 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20  DWORD dwFlags = 
1a1a0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
1a1b0 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69  MEDIATELY;.    i
1a1c0 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
1a1d0 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
1a1e0 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
1a1f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
1a200 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
1a210 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
1a220 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f  le.h, dwFlags, o
1a230 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
1a240 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20  );.  }.  .  if( 
1a250 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63  rc!= 0 ){.    rc
1a260 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a270 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1a280 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f  ->lastErrno =  o
1a290 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1a2a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a2b0 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53  _BUSY;.  }..  OS
1a2c0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1a2d0 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25   file=%p, func=%
1a2e0 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63  s, errno=%lu, rc
1a2f0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1a300 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e     pFile->hFile.
1a310 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  h, (lockType == 
1a320 5f 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77  _SHM_UNLCK) ? "w
1a330 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a  inUnlockFile" :.
1a340 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c             "winL
1a350 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  ockFile", pFile-
1a360 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69  >lastErrno, sqli
1a370 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1a380 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1a390 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
1a3a0 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
1a3b0 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69  methods */.stati
1a3c0 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71  c int winOpen(sq
1a3d0 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74  lite3_vfs*,const
1a3e0 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66   char*,sqlite3_f
1a3f0 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a  ile*,int,int*);.
1a400 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
1a410 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
1a420 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69   *,const char*,i
1a430 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67  nt);../*.** Purg
1a440 65 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  e the winShmNode
1a450 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c  List list of all
1a460 20 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69   entries with wi
1a470 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
1a480 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1a490 6e 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64  not a VFS shared
1a4a0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20  -memory method; 
1a4b0 69 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  it is a utility 
1a4c0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a  function called.
1a4d0 2a 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64  ** by VFS shared
1a4e0 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e  -memory methods.
1a4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a500 77 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69  winShmPurge(sqli
1a510 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
1a520 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a  nt deleteFlag){.
1a530 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70    winShmNode **p
1a540 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  p;.  winShmNode 
1a550 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69  *p;.  assert( wi
1a560 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1a570 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1a580 48 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75  HM-PURGE pid=%lu
1a590 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c  , deleteFlag=%d\
1a5a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1a5b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1a5c0 73 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c  ssId(), deleteFl
1a5d0 61 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69  ag));.  pp = &wi
1a5e0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20  nShmNodeList;.  
1a5f0 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29  while( (p = *pp)
1a600 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
1a610 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1a620 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1a630 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20  if( p->mutex ){ 
1a640 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
1a650 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a  ee(p->mutex); }.
1a660 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1a670 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
1a680 29 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20  ){.        BOOL 
1a690 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65  bRc = osUnmapVie
1a6a0 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69  wOfFile(p->aRegi
1a6b0 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20  on[i].pMap);.   
1a6c0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1a6d0 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70  HM-PURGE-UNMAP p
1a6e0 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25  id=%lu, region=%
1a6f0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1a710 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1a720 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20  sId(), i, bRc ? 
1a730 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1a740 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45  );.        UNUSE
1a750 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45  D_VARIABLE_VALUE
1a760 28 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62  (bRc);.        b
1a770 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  Rc = osCloseHand
1a780 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
1a790 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .hMap);.        
1a7a0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
1a7b0 52 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c  RGE-CLOSE pid=%l
1a7c0 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
1a7d0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1a7e0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1a7f0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1a800 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
1a810 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
1a820 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52        UNUSED_VAR
1a830 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29  IABLE_VALUE(bRc)
1a840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a850 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d  if( p->hFile.h!=
1a860 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65  NULL && p->hFile
1a870 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  .h!=INVALID_HAND
1a880 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
1a890 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1a8a0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1a8b0 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28        winClose((
1a8c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1a8d0 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20  p->hFile);.     
1a8e0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a8f0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1a900 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
1a910 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20  eleteFlag ){.   
1a920 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1a930 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1a940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
1a950 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
1a960 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65  );.        winDe
1a970 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46  lete(pVfs, p->zF
1a980 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  ilename, 0);.   
1a990 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
1a9a0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1a9b0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1a9c0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1a9d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1a9e0 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  pp = p->pNext;. 
1a9f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1aa00 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20  e(p->aRegion);. 
1aa10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1aa20 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e(p);.    }else{
1aa30 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e  .      pp = &p->
1aa40 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
1aa50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74  .}../*.** Open t
1aa60 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
1aa70 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
1aa80 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66   with database f
1aa90 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a  ile pDbFd..**.**
1aaa0 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
1aab0 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
1aac0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
1aad0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
1aae0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
1aaf0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
1ab00 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
1ab10 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
1ab20 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
1ab30 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
1ab40 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
1ab50 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
1ab60 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
1ab70 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
1ab80 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72   int winOpenShar
1ab90 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65  edMemory(winFile
1aba0 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75   *pDbFd){.  stru
1abb0 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  ct winShm *p;   
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1abd0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
1abe0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
1abf0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1ac00 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
1ac10 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64   0;   /* The und
1ac20 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
1ac30 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
1ac40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac60 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
1ac70 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
1ac80 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  de *pNew;       
1ac90 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c      /* Newly all
1aca0 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64  ocated winShmNod
1acb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  e */.  int nName
1acc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1acd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ace0 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79  e of zName in by
1acf0 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  tes */..  assert
1ad00 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
1ad10 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72   );    /* Not pr
1ad20 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20  eviously opened 
1ad30 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
1ad40 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
1ad50 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20  new sqlite3_shm 
1ad60 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70  object.  Also sp
1ad70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a  eculatively.  **
1ad80 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
1ad90 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d  for a new winShm
1ada0 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d  Node and filenam
1adb0 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71  e..  */.  p = sq
1adc0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
1add0 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
1ade0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1adf0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ae00 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d  NOMEM;.  nName =
1ae10 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1ae20 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  (pDbFd->zPath);.
1ae30 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1ae40 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
1ae50 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
1ae60 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20  nName + 17 );.  
1ae70 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1ae80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ae90 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
1aea0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1aeb0 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a  M;.  }.  pNew->z
1aec0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
1aed0 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71  *)&pNew[1];.  sq
1aee0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1aef0 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a  Name+15, pNew->z
1af00 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68  Filename, "%s-sh
1af10 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
1af20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65  );.  sqlite3File
1af30 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a  Suffix3(pDbFd->z
1af40 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  Path, pNew->zFil
1af50 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c  ename); ..  /* L
1af60 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  ook to see if th
1af70 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69  ere is an existi
1af80 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68  ng winShmNode th
1af90 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  at can be used..
1afa0 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68    ** If no match
1afb0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63  ing winShmNode c
1afc0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
1afd0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1afe0 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  e..  */.  winShm
1aff0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1b000 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77  for(pShmNode = w
1b010 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70  inShmNodeList; p
1b020 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64  ShmNode; pShmNod
1b030 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78  e=pShmNode->pNex
1b040 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e  t){.    /* TBD n
1b050 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77  eed to come up w
1b060 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68  ith better match
1b070 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a   here.  Perhaps.
1b080 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f      ** use FILE_
1b090 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f  ID_BOTH_DIR_INFO
1b0a0 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   Structure..    
1b0b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1b0c0 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f  e3StrICmp(pShmNo
1b0d0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  de->zFilename, p
1b0e0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d  New->zFilename)=
1b0f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
1b100 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
1b110 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1b120 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
1b130 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  e{.    pShmNode 
1b140 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
1b150 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46   = 0;.    ((winF
1b160 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d  ile*)(&pShmNode-
1b170 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e  >hFile))->h = IN
1b180 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1b190 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  UE;.    pShmNode
1b1a0 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d  ->pNext = winShm
1b1b0 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69  NodeList;.    wi
1b1c0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70  nShmNodeList = p
1b1d0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53  ShmNode;..    pS
1b1e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
1b1f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1b200 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1b210 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
1b220 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
1b230 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1b240 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1b250 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1b260 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1b270 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69    }..    rc = wi
1b280 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66  nOpen(pDbFd->pVf
1b290 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1b2a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46      pShmNode->zF
1b2b0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
1b2c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b2d0 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29  the file (UTF-8)
1b2e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1b2f0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69       (sqlite3_fi
1b300 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
1b310 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68  File,  /* File h
1b320 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1b340 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c  QLITE_OPEN_WAL |
1b350 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1b360 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
1b370 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20  OPEN_CREATE,.   
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
1b390 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
1b3a0 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20  _OK!=rc ){.     
1b3b0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1b3c0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rr;.    }..    /
1b3d0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1b3e0 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
1b3f0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
1b400 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
1b410 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  ..    ** If not,
1b420 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1b430 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1b440 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  h. .    */.    i
1b450 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
1b460 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1b470 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
1b480 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
1b490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1b4a0 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
1b4b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
1b4c0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1b4d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1b4e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b4f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1b500 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1b510 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f  IOERR_SHMOPEN, o
1b520 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
1b530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b540 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
1b550 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
1b560 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1b570 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1b580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b590 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
1b5a0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1b5b0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1b5c0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1b5d0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1b5e0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1b5f0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
1b600 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1b610 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
1b620 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1b630 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
1b640 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
1b650 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
1b660 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
1b670 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1b680 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
1b690 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1b6a0 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
1b6b0 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
1b6c0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
1b6d0 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
1b6e0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
1b6f0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1b700 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
1b710 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1b720 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
1b730 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1b740 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
1b750 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
1b760 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65  f the winShmEnte
1b770 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
1b780 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
1b790 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
1b7a0 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29   (struct winShm)
1b7b0 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
1b7c0 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
1b7d0 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
1b7e0 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
1b7f0 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
1b800 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
1b810 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1b820 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
1b830 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
1b840 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
1b850 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
1b860 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
1b870 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
1b880 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
1b890 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b8a0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1b8b0 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
1b8c0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1b8d0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
1b8e0 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
1b8f0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1b900 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1b910 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b920 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
1b930 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
1b940 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
1b950 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
1b960 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1b970 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
1b980 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
1b990 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
1b9a0 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
1b9b0 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
1b9c0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
1b9d0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
1b9e0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1b9f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
1ba00 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
1ba10 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
1ba20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ba30 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
1ba40 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
1ba50 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
1ba60 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
1ba70 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
1ba80 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
1ba90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1baa0 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  nShmUnmap(.  sql
1bab0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
1bac0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1bad0 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
1bae0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1baf0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
1bb00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
1bb10 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
1bb20 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
1bb30 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
1bb40 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
1bb50 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
1bb60 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
1bb70 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
1bb80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
1bb90 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
1bba0 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
1bbb0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
1bbc0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1bbd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1bbe0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
1bbf0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
1bc00 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1bc10 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
1bc20 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
1bc30 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
1bc40 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
1bc50 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
1bc60 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1bc70 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
1bc80 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
1bc90 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
1bca0 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
1bcb0 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
1bcc0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
1bcd0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
1bce0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
1bcf0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1bd00 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1bd10 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
1bd20 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
1bd30 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
1bd40 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
1bd50 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
1bd60 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
1bd70 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
1bd80 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1bd90 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
1bda0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1bdb0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1bdc0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
1bdd0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
1bde0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
1bdf0 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
1be00 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
1be10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
1be20 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
1be30 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
1be40 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
1be50 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
1be60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
1be70 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
1be80 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1be90 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
1bea0 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
1beb0 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
1bec0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
1bed0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1bee0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1bef0 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
1bf00 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
1bf10 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1bf20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bf30 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
1bf40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1bf50 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1bf60 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
1bf70 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1bf80 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
1bf90 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1bfa0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
1bfb0 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
1bfc0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1bfd0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
1bfe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1bff0 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
1c000 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1c010 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
1c040 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
1c050 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
1c060 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
1c070 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
1c080 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
1c090 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1c0a0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
1c0b0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
1c0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c0d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
1c0e0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
1c0f0 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
1c100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c110 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1c120 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
1c130 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
1c140 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1c150 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1c160 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c170 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1c180 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1c190 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
1c1a0 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
1c1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1c0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
1c1d0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
1c1e0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
1c1f0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
1c200 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
1c210 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
1c220 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
1c230 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
1c240 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1c250 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
1c260 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
1c270 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1c280 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1c290 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
1c2a0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1c2b0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1c2c0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1c2d0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
1c2e0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1c2f0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1c300 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1c310 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
1c320 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
1c330 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
1c340 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
1c350 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
1c360 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
1c370 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
1c380 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
1c390 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
1c3a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c3b0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1c3c0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
1c3d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
1c3e0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
1c3f0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
1c400 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
1c410 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1c420 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
1c430 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
1c440 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
1c450 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
1c460 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
1c470 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
1c480 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
1c490 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
1c4a0 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
1c4b0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
1c4c0 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
1c4d0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
1c4e0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
1c4f0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
1c500 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
1c510 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
1c520 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
1c530 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
1c540 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
1c550 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1c560 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1c570 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
1c580 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
1c590 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
1c5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c5b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c5c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
1c5d0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
1c5e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1c5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c600 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
1c610 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
1c620 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
1c630 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
1c640 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
1c650 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
1c660 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
1c670 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
1c680 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
1c690 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
1c6a0 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
1c6b0 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
1c6c0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
1c6d0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
1c6e0 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
1c6f0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1c700 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
1c710 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
1c720 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
1c730 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
1c740 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
1c750 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
1c760 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
1c770 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1c780 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1c790 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c7a0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1c7b0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1c7c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c7d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1c7e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1c7f0 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
1c800 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1c810 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1c820 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
1c830 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1c840 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
1c850 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
1c860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c870 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
1c880 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
1c890 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c8a0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1c8b0 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1c8c0 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _RDLCK, ofst+WIN
1c8d0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1c8e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c8f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c900 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1c910 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
1c920 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
1c930 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1c940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c950 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1c960 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1c970 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c980 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
1c990 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1c9a0 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
1c9b0 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
1c9c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
1c9d0 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
1c9e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1c9f0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
1ca00 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1ca10 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1ca20 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1ca30 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1ca40 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1ca50 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
1ca60 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1ca70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1ca80 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ca90 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1caa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cab0 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
1cac0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
1cad0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
1cae0 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
1caf0 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
1cb00 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
1cb10 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
1cb20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
1cb30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1cb40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cb50 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
1cb60 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1cb70 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
1cb80 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
1cb90 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
1cba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cbb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
1cbc0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
1cbd0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
1cbe0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
1cbf0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
1cc00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cc10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1cc20 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1cc30 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
1cc40 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69  CE(("SHM-LOCK pi
1cc50 64 3d 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68  d=%lu, id=%d, sh
1cc60 61 72 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65  aredMask=%03x, e
1cc70 78 63 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63  xclMask=%03x, rc
1cc80 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1cc90 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1cca0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69  rocessId(), p->i
1ccb0 64 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  d, p->sharedMask
1ccc0 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20  , p->exclMask,. 
1ccd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cce0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1ccf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cd00 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
1cd10 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
1cd20 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
1cd30 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
1cd40 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
1cd50 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
1cd60 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
1cd70 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
1cd80 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
1cd90 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
1cda0 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
1cdb0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
1cdc0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
1cdd0 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69  mBarrier(.  sqli
1cde0 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20  te3_file *fd    
1cdf0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1ce00 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1ce10 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
1ce20 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1ce30 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d  ETER(fd);.  /* M
1ce40 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
1ce50 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  // does not work
1ce60 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20   -- do not know 
1ce70 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e  why not */.  win
1ce80 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1ce90 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1cea0 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
1ceb0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cec0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1ced0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1cee0 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1cef0 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d   the .** shared-
1cf00 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
1cf10 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1cf20 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
1cf30 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1cf40 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65  ns .** are numbe
1cf50 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f  red starting fro
1cf60 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61  m zero. Each sha
1cf70 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1cf80 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a  n is szRegion .*
1cf90 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
1cfa0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1cfb0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1cfc0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1cfd0 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20  rned and *pp is 
1cfe0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
1cff0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1d000 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61 72   the isWrite par
1d010 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20  ameter is 0 and 
1d020 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
1d030 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72  ared-memory.** r
1d040 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  egion has not be
1d050 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79  en allocated (by
1d060 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63   any client, inc
1d070 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69  luding one runni
1d080 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72  ng in a.** separ
1d090 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68  ate process), th
1d0a0 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  en *pp is set to
1d0b0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
1d0c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
1d0d0 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20   .** isWrite is 
1d0e0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1d0f0 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1d100 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1d110 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20  has not yet .** 
1d120 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
1d130 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  it is allocated 
1d140 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1d150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
1d160 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1d170 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1d180 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f  been allocated o
1d190 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  r is allocated b
1d1a0 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61  y.** this call a
1d1b0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1d1c0 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61  e, then it is ma
1d1d0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1d1e0 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64  rocesses .** add
1d1f0 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1d200 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d210 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1d220 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1d230 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  pped .** memory 
1d240 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1d250 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1d260 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28  c int winShmMap(
1d270 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1d280 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
1d290 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
1d2a0 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
1d2b0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
1d2c0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
1d2d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
1d2e0 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
1d2f0 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
1d300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d310 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1d320 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  gions */.  int i
1d330 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  sWrite,         
1d340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d350 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
1d360 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
1d370 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
1d380 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
1d390 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
1d3a0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
1d3b0 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
1d3c0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
1d3d0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70  .  winShm *p = p
1d3e0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69  DbFd->pShm;.  wi
1d3f0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1d400 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1d410 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1d420 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20   !p ){.    rc = 
1d430 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
1d440 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
1d450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d460 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1d470 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53     p = pDbFd->pS
1d480 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f  hm;.  }.  pShmNo
1d490 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1d4a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
1d4b0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
1d4c0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
1d4d0 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
1d4e0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
1d4f0 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
1d500 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
1d510 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1d520 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
1d530 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d  {.    struct Shm
1d540 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20  Region *apNew;  
1d550 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1d560 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  aRegion[] array 
1d570 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
1d580 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
1d590 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
1d5a0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
1d5b0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
1d5c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
1d5f0 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66  e of wal-index f
1d600 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  ile */..    pShm
1d610 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
1d620 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
1d630 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1d640 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
1d650 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1d660 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
1d670 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
1d680 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1d690 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
1d6a0 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
1d6b0 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
1d6c0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
1d6d0 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
1d6e0 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
1d6f0 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
1d700 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  /.    rc = winFi
1d710 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
1d720 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
1d730 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20  ->hFile, &sz);. 
1d740 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1d760 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1d770 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
1d780 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  IZE, osGetLastEr
1d790 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1d7b0 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46  inShmMap1", pDbF
1d7c0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1d7d0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1d7e0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
1d7f0 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20  ( sz<nByte ){.  
1d800 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1d810 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
1d820 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
1d830 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73  t. If isWrite is
1d840 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
1d850 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c   zero, exit earl
1d860 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
1d870 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
1d880 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1d890 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
1d8a0 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
1d8b0 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69  ly, if isWrite i
1d8c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20  s non-zero, use 
1d8d0 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
1d8e0 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
1d8f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
1d900 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
1d910 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1d920 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f   !isWrite ) goto
1d930 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
1d940 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
1d950 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
1d960 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
1d970 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  hFile, nByte);. 
1d980 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d9a0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1d9b0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1d9c0 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
1d9d0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22      "winShmMap2"
1da00 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1da10 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
1da20 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
1da30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1da40 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
1da50 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1da60 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1da70 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
1da80 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
1da90 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65   = (struct ShmRe
1daa0 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72  gion *)sqlite3_r
1dab0 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
1dac0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1dad0 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73  n, (iRegion+1)*s
1dae0 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a  izeof(apNew[0]).
1daf0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
1db00 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
1db10 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1db20 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
1db30 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1db40 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
1db50 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70  de->aRegion = ap
1db60 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  New;..    while(
1db70 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1db80 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
1db90 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70       HANDLE hMap
1dba0 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20   = NULL;        
1dbb0 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67   /* file-mapping
1dbc0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20   handle */.     
1dbd0 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b   void *pMap = 0;
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbf0 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65  Mapped memory re
1dc00 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23 69  gion */.     .#i
1dc10 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1dc20 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  T.      hMap = o
1dc30 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1dc40 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f  ngFromApp(pShmNo
1dc50 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20  de->hFile.h,.   
1dc60 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1dc70 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42 79  E_READWRITE, nBy
1dc80 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
1dc90 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1dca0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1dcb0 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d 61  _WIDE).      hMa
1dcc0 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1dcd0 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64  MappingW(pShmNod
1dce0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
1dcf0 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1dd00 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
1dd10 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1dd20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1dd30 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1dd40 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20 20  HAS_ANSI).      
1dd50 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1dd60 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68 6d  ileMappingA(pShm
1dd70 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
1dd80 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1dd90 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1dda0 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
1ddb0 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20       );.#endif. 
1ddc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
1ddd0 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45 20 70 69  HM-MAP-CREATE pi
1dde0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1ddf0 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73  , size=%d, rc=%s
1de00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1de10 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1de20 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
1de30 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
1de40 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
1de50 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b        hMap ? "ok
1de60 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1de70 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1de80 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
1de90 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65  ffset = pShmNode
1dea0 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
1deb0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  on;.        int 
1dec0 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1ded0 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1dee0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1def0 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66  Granularity;.#if
1df00 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1df10 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1df20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
1df30 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c  romApp(hMap, FIL
1df40 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
1df50 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
1df60 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
1df70 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
1df80 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
1df90 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
1dfa0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
1dfb0 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1dfc0 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
1dfd0 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
1dfe0 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
1dff0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f             0, iO
1e000 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
1e010 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
1e020 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
1e030 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
1e040 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1e050 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50 20 70 69  ("SHM-MAP-MAP pi
1e060 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1e070 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
1e080 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1e0b0 63 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f  cessId(), pShmNo
1e0c0 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66  de->nRegion, iOf
1e0d0 66 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  fset,.          
1e0e0 20 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c         szRegion,
1e0f0 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   pMap ? "ok" : "
1e100 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1e110 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d   }.      if( !pM
1e120 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  ap ){.        pS
1e130 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e  hmNode->lastErrn
1e140 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
1e150 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63  or();.        rc
1e160 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1e170 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
1e180 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61  AP, pShmNode->la
1e190 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20    "winShmMap3", 
1e1c0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1e1d0 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20         if( hMap 
1e1e0 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  ) osCloseHandle(
1e1f0 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67  hMap);.        g
1e200 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1e210 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1e220 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1e230 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1e240 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70  ion].pMap = pMap
1e250 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e260 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1e270 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61  de->nRegion].hMa
1e280 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20  p = hMap;.      
1e290 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e2a0 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n++;.    }.  }..
1e2b0 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
1e2c0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1e2d0 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
1e2e0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
1e2f0 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  = iRegion*szRegi
1e300 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  on;.    int iOff
1e310 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
1e320 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
1e330 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
1e340 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61  ularity;.    cha
1e350 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70  r *p = (char *)p
1e360 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1e370 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a  [iRegion].pMap;.
1e380 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20      *pp = (void 
1e390 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66  *)&p[iOffsetShif
1e3a0 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
1e3b0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
1e3c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1e3d0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
1e3e0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1e3f0 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65  c;.}..#else.# de
1e400 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20  fine winShmMap  
1e410 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
1e420 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20  nShmLock    0.# 
1e430 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72  define winShmBar
1e440 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
1e450 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  winShmUnmap   0.
1e460 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
1e470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1e480 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  L */../*.** Clea
1e490 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65 64  ns up the mapped
1e4a0 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 73   region of the s
1e4b0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 69  pecified file, i
1e4c0 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51  f any..*/.#if SQ
1e4d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1e4e0 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
1e4f0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
1e500 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
1e510 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
1e520 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
1e530 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1e540 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d  lu, pFile=%p, hM
1e550 61 70 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  ap=%p, pMapRegio
1e560 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
1e570 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c     "mmapSize=%ll
1e580 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d, mmapSizeActua
1e590 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65  l=%lld, mmapSize
1e5a0 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  Max=%lld\n",.   
1e5b0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1e5c0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1e5d0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
1e5e0 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  Map, pFile->pMap
1e5f0 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Region,.        
1e600 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
1e610 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ze, pFile->mmapS
1e620 69 7a 65 41 63 74 75 61 6c 2c 20 70 46 69 6c 65  izeActual, pFile
1e630 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b  ->mmapSizeMax));
1e640 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d  .  if( pFile->pM
1e650 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  apRegion ){.    
1e660 69 66 28 20 21 6f 73 55 6e 6d 61 70 56 69 65 77  if( !osUnmapView
1e670 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d  OfFile(pFile->pM
1e680 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20  apRegion) ){.   
1e690 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1e6a0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1e6b0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
1e6c0 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1e6d0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1e6e0 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  e=%p, pMapRegion
1e6f0 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
1e700 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45        "rc=SQLITE
1e710 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20  _IOERR_MMAP\n", 
1e720 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e730 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a  essId(), pFile,.
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e750 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e760 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1e770 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1e780 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1e790 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e7a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e7b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
1e7c0 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70 46 69 6c  nmapfile1", pFil
1e7d0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
1e7e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  .    pFile->pMap
1e7f0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20  Region = 0;.    
1e800 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1e810 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1e820 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d  mmapSizeActual =
1e830 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46   0;.  }.  if( pF
1e840 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20  ile->hMap!=NULL 
1e850 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c  ){.    if( !osCl
1e860 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
1e870 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20  >hMap) ){.      
1e880 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1e890 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1e8a0 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
1e8b0 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
1e8c0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1e8d0 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53  p, hMap=%p, rc=S
1e8e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1e8f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e900 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1e910 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1e920 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29  le, pFile->hMap)
1e930 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e940 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1e950 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
1e960 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
1e970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e980 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
1e990 6d 61 70 66 69 6c 65 32 22 2c 20 70 46 69 6c 65  mapfile2", pFile
1e9a0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1e9b0 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
1e9c0 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53  = NULL;.  }.  OS
1e9d0 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1e9e0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1e9f0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1ea00 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
1ea10 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1ea20 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
1ea30 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1ea40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ea50 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72   Memory map or r
1ea60 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70  emap the file op
1ea70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73  ened by file-des
1ea80 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66 20  criptor pFd (if 
1ea90 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61  the file.** is a
1eaa0 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74  lready mapped, t
1eab0 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
1eac0 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64 20  ing is replaced 
1ead0 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c  by the new). Or,
1eae0 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c   if .** there al
1eaf0 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20 6d  ready exists a m
1eb00 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20  apping for this 
1eb10 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20  file, and there 
1eb20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75  are still .** ou
1eb30 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68  tstanding xFetch
1eb40 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  () references to
1eb50 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69   it, this functi
1eb60 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1eb70 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
1eb80 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e  r nByte is non-n
1eb90 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74  egative, then it
1eba0 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74 65   is the requeste
1ebb0 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68  d size of .** th
1ebc0 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
1ebd0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
1ebe0 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
1ebf0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1ec00 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
1ec10 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
1ec20 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1ec30 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
1ec40 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
1ec50 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
1ec60 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
1ec70 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
1ec80 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
1ec90 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e  figured .** usin
1eca0 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  g SQLITE_FCNTL_M
1ecb0 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65  MAP_SIZE, whiche
1ecc0 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a  ver is smaller..
1ecd0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
1ece0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
1ecf0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  o error occurs (
1ed00 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70  even if the mapp
1ed10 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65  ing is not.** re
1ed20 63 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73  created as a res
1ed30 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  ult of outstandi
1ed40 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f  ng references) o
1ed50 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
1ed60 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77  r.** code otherw
1ed70 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1ed80 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69  nt winMapfile(wi
1ed90 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69  nFile *pFd, sqli
1eda0 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
1edb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
1edc0 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
1edd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1ede0 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
1edf0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
1ee00 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
1ee10 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
1ee20 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a  u, pFile=%p, siz
1ee30 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20  e=%lld\n",.     
1ee40 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1ee50 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
1ee60 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20  Fd, nByte));..  
1ee70 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  if( pFd->nFetchO
1ee80 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51  ut>0 ) return SQ
1ee90 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
1eea0 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63  nMap<0 ){.    rc
1eeb0 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
1eec0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46  sqlite3_file*)pF
1eed0 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69  d, &nMap);.    i
1eee0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f  f( rc ){.      O
1eef0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1ef00 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1ef10 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
1ef20 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20  OERR_FSTAT\n",. 
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
1ef40 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1ef50 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20  sId(), pFd));.  
1ef60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ef70 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1ef80 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
1ef90 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  Map>pFd->mmapSiz
1efa0 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70  eMax ){.    nMap
1efb0 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
1efc0 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20  Max;.  }.  nMap 
1efd0 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74  &= ~(sqlite3_int
1efe0 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64  64)(winSysInfo.d
1eff0 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  wPageSize - 1);.
1f000 20 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20   .  if( nMap==0 
1f010 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  && pFd->mmapSize
1f020 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d  >0 ){.    winUnm
1f030 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
1f040 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64  .  if( nMap!=pFd
1f050 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1f060 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30    void *pNew = 0
1f070 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74  ;.    DWORD prot
1f080 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f  ect = PAGE_READO
1f090 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66  NLY;.    DWORD f
1f0a0 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f  lags = FILE_MAP_
1f0b0 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e  READ;..    winUn
1f0c0 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
1f0d0 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c    if( (pFd->ctrl
1f0e0 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
1f0f0 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  RDONLY)==0 ){.  
1f100 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41      protect = PA
1f110 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  GE_READWRITE;.  
1f120 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c      flags |= FIL
1f130 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20  E_MAP_WRITE;.   
1f140 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
1f150 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64 2d 3e  _WINRT.    pFd->
1f160 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1f170 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70  ileMappingFromAp
1f180 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  p(pFd->h, NULL, 
1f190 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20 4e  protect, nMap, N
1f1a0 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  ULL);.#elif defi
1f1b0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1f1c0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 70  _HAS_WIDE).    p
1f1d0 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65  Fd->hMap = osCre
1f1e0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
1f1f0 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72  pFd->h, NULL, pr
1f200 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  otect,.         
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28         (DWORD)((
1f230 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66  nMap>>32) & 0xff
1f240 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20  ffffff),.       
1f250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f260 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1f270 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66  (nMap & 0xffffff
1f280 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69  ff), NULL);.#eli
1f290 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f2a0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
1f2b0 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
1f2c0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1f2d0 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55  pingA(pFd->h, NU
1f2e0 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20  LL, protect,.   
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1f310 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20  ORD)((nMap>>32) 
1f320 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20  & 0xffffffff),. 
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f350 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78  DWORD)(nMap & 0x
1f360 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29  ffffffff), NULL)
1f370 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1f380 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c   pFd->hMap==NULL
1f390 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c   ){.      pFd->l
1f3a0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1f3b0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1f3c0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1f3d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1f3e0 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74  _MMAP, pFd->last
1f3f0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
1f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1f410 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64  inMapfile1", pFd
1f420 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1f430 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72  /* Log the error
1f440 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e  , but continue n
1f450 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20  ormal operation 
1f460 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
1f470 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52  te */.      OSTR
1f480 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43  ACE(("MAP-FILE-C
1f490 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  REATE pid=%lu, p
1f4a0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
1f4b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1f4c0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1f4d0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1f4e0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1f4f0 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
1f500 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f510 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1f520 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e  (nMap % winSysIn
1f530 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d  fo.dwPageSize)==
1f540 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1f550 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d   sizeof(SIZE_T)=
1f560 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f  =sizeof(sqlite3_
1f570 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d  int64) || nMap<=
1f580 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69  0xffffffff );.#i
1f590 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1f5a0 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  T.    pNew = osM
1f5b0 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
1f5c0 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66  App(pFd->hMap, f
1f5d0 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54  lags, 0, (SIZE_T
1f5e0 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20  )nMap);.#else.  
1f5f0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69    pNew = osMapVi
1f600 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d  ewOfFile(pFd->hM
1f610 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c  ap, flags, 0, 0,
1f620 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a   (SIZE_T)nMap);.
1f630 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
1f640 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
1f650 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
1f660 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20  (pFd->hMap);.   
1f670 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e     pFd->hMap = N
1f680 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ULL;.      pFd->
1f690 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1f6a0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1f6b0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1f6c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1f6d0 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73  R_MMAP, pFd->las
1f6e0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1f700 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46  winMapfile2", pF
1f710 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1f720 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f   /* Log the erro
1f730 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20  r, but continue 
1f740 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e  normal operation
1f750 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72   using xRead/xWr
1f760 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54  ite */.      OST
1f770 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d  RACE(("MAP-FILE-
1f780 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
1f790 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
1f7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f7b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1f7c0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
1f7d0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1f7e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1f7f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f800 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52  }.    pFd->pMapR
1f810 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20  egion = pNew;.  
1f820 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
1f830 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d  = nMap;.    pFd-
1f840 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
1f850 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f  = nMap;.  }..  O
1f860 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1f870 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1f880 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1f890 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1f8a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f8b0 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1f8c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f8d0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1f8e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1f8f0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a  _SIZE>0 */../*.*
1f900 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72  * If possible, r
1f910 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f920 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20  to a mapping of 
1f930 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67  file fd starting
1f940 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f   at offset.** iO
1f950 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20  ff. The mapping 
1f960 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f  must be valid fo
1f970 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20  r at least nAmt 
1f980 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  bytes..**.** If 
1f990 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63  such a pointer c
1f9a0 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  an be obtained, 
1f9b0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20  store it in *pp 
1f9c0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1f9d0 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  E_OK..** Or, if 
1f9e0 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e  one cannot but n
1f9f0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
1fa00 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64  set *pp to 0 and
1fa10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fa20 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69  K..** Finally, i
1fa30 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20  f an error does 
1fa40 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e  occur, return an
1fa50 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1fa60 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a  de. The final.**
1fa70 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73   value of *pp is
1fa80 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
1fa90 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
1faa0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
1fab0 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f  does return a po
1fac0 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65  inter, the calle
1fad0 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c  r must eventuall
1fae0 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68  y .** release th
1faf0 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63  e reference by c
1fb00 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74 63  alling winUnfetc
1fb10 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
1fb20 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69  nt winFetch(sqli
1fb30 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
1fb40 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
1fb50 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
1fb60 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1fb70 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
1fb80 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
1fb90 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
1fba0 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
1fbb0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
1fbc0 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
1fbd0 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
1fbe0 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
1fbf0 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64  =%p, offset=%lld
1fc00 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d  , amount=%d, pp=
1fc10 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
1fc20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1fc30 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 69  ocessId(), fd, i
1fc40 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b  Off, nAmt, pp));
1fc50 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1fc60 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
1fc70 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
1fc80 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
1fc90 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
1fca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1fcb0 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
1fcc0 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
1fcd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fce0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f 53  OK ){.        OS
1fcf0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69  TRACE(("FETCH pi
1fd00 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1fd10 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1fd30 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1fd40 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
1fd50 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1fd60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1fd70 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1fd80 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
1fd90 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
1fda0 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
1fdb0 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
1fdc0 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
1fdd0 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
1fde0 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
1fdf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  .  }.#endif..  O
1fe00 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
1fe10 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1fe20 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c  , pp=%p, *pp=%p,
1fe30 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1fe40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1fe50 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1fe60 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70  Id(), fd, pp, *p
1fe70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p));.  return SQ
1fe80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1fe90 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20 61  * If the third a
1fea0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e  rgument is non-N
1feb0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
1fec0 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73  unction releases
1fed0 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65   a .** reference
1fee0 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
1fef0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
1ff00 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20  winFetch(). The 
1ff10 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
1ff20 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1ff30 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
1ff40 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1ff50 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1ff60 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
1ff70 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
1ff80 74 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69  the winFetch() i
1ff90 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
1ffa0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
1ffb0 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
1ffc0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
1ffd0 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
1ffe0 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
1fff0 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
20000 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
20010 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
20020 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
20030 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
20040 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
20050 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
20060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20070 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74  winUnfetch(sqlit
20080 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
20090 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
200a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
200b0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
200c0 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
200d0 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
200e0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
200f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
20100 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
20110 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
20120 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
20130 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
20140 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46  tanding .  ** xF
20150 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e  etch references.
20160 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65   Or, if p!=0 (me
20170 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78  aning it is an x
20180 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29  Fetch reference)
20190 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72  ,.  ** then ther
201a0 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
201b0 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
201c0 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ng.  */.  assert
201d0 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e  ( (p==0)==(pFd->
201e0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b  nFetchOut==0) );
201f0 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20  ..  /* If p!=0, 
20200 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68  it must match th
20210 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f  e iOff value. */
20220 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
20230 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46  || p==&((u8 *)pF
20240 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
20250 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41  Off] );..  OSTRA
20260 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64  CE(("UNFETCH pid
20270 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
20280 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25  offset=%lld, p=%
20290 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
202a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
202b0 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69  cessId(), pFd, i
202c0 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28  Off, p));..  if(
202d0 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
202e0 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
202f0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d  lse{.    /* FIXM
20300 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74  E:  If Windows t
20310 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76  ruly always prev
20320 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20  ents truncating 
20330 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20  or deleting a.  
20340 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20    ** file while 
20350 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c  a mapping is hel
20360 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c  d, then the foll
20370 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69  owing winUnmapfi
20380 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  le() call.    **
20390 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
203a0 63 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74 74  can can be omitt
203b0 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  ed - potentially
203c0 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a   improving.    *
203d0 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20  * performance.  
203e0 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  */.    winUnmapf
203f0 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20  ile(pFd);.  }.. 
20400 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
20410 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65  etchOut>=0 );.#e
20420 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
20430 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c  ("UNFETCH pid=%l
20440 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
20450 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
20460 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20470 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20480 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e  , fd));.  return
20490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
204a0 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
204b0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
204c0 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
204d0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
204e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
204f0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
20500 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
20510 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
20520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20530 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
20540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20580 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  /../*.** This ve
20590 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c  ctor defines all
205a0 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61   the methods tha
205b0 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e  t can operate on
205c0 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66   an.** sqlite3_f
205d0 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a  ile for win32..*
205e0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
205f0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
20600 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20  s winIoMethod = 
20610 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20  {.  3,          
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20630 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
20640 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20  */.  winClose,  
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20660 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
20670 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20  /.  winRead,    
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a      /* xRead */.
206a0 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20    winWrite,     
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206c0 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20    /* xWrite */. 
206d0 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20   winTruncate,   
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206f0 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
20700 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20  .  winSync,     
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20720 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
20730 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20   winFileSize,   
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20750 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
20760 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20  .  winLock,     
20770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20780 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20     /* xLock */. 
20790 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   winUnlock,     
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
207c0 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
207d0 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  dLock,          
207e0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
207f0 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46  edLock */.  winF
20800 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
20810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
20820 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
20830 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20   winSectorSize, 
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
20860 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68  */.  winDeviceCh
20870 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
20880 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43       /* xDeviceC
20890 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
208a0 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20  /.  winShmMap,  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
208d0 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20  /.  winShmLock, 
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20      /* xShmLock 
20900 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69  */.  winShmBarri
20910 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
20920 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
20930 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55  ier */.  winShmU
20940 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
20950 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
20960 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65  Unmap */.  winFe
20970 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
20980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
20990 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66  etch */.  winUnf
209a0 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  etch            
209b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
209c0 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a  fetch */.};../**
209d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
209f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
20a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a30 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f  ******* sqlite3_
20a40 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
20a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20a60 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
20a70 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  his division con
20a80 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d  tains the implem
20a90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68  entation of meth
20aa0 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71  ods on the.** sq
20ab0 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74  lite3_vfs object
20ac0 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ..*/..#if define
20ad0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a  d(__CYGWIN__)./*
20ae0 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69  .** Convert a fi
20af0 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74  lename from what
20b00 65 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79  ever the underly
20b10 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ing operating sy
20b20 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73  stem.** supports
20b30 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69   for filenames i
20b40 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63  nto UTF-8.  Spac
20b50 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
20b60 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69  sult is.** obtai
20b70 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
20b80 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
20b90 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
20ba0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
20bb0 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f  atic char *winCo
20bc0 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
20bd0 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ame(const void *
20be0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
20bf0 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ar *zConverted =
20c00 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54   0;.  if( osIsNT
20c10 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  () ){.    zConve
20c20 72 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64  rted = winUnicod
20c30 65 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d  eToUtf8(zFilenam
20c40 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
20c50 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
20c60 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
20c70 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
20c80 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
20c90 5f 74 6f 5f 75 74 66 38 28 7a 46 69 6c 65 6e 61  _to_utf8(zFilena
20ca0 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
20cb0 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
20cc0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
20cd0 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
20ce0 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
20cf0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
20d00 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69  nvert a UTF-8 fi
20d10 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74  lename into what
20d20 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e  ever form the un
20d30 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72  derlying.** oper
20d40 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e  ating system wan
20d50 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e  ts filenames in.
20d60 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
20d70 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73  the result.** is
20d80 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
20d90 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
20da0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
20db0 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
20dc0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
20dd0 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72  id *winConvertFr
20de0 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  omUtf8Filename(c
20df0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
20e00 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a  name){.  void *z
20e10 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
20e20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
20e30 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
20e40 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  = winUtf8ToUnico
20e50 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
20e60 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20e70 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
20e80 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e    else{.    zCon
20e90 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
20ea0 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
20eb0 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
20ec0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
20ed0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
20ee0 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
20ef0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
20f00 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
20f10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20f20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
20f30 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
20f40 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62  d UTF-8 string b
20f50 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69  uffer.** ends wi
20f60 74 68 20 61 20 64 69 72 65 63 74 6f 72 79 20 73  th a directory s
20f70 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
20f80 65 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75  er or one was su
20f90 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64  ccessfully.** ad
20fa0 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74  ded to it..*/.st
20fb0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65  atic int winMake
20fc0 45 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20  EndInDirSep(int 
20fd0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
20fe0 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b  ){.  if( zBuf ){
20ff0 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20  .    int nLen = 
21000 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
21010 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e  zBuf);.    if( n
21020 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Len>0 ){.      i
21030 66 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a  f( winIsDirSep(z
21040 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a  Buf[nLen-1]) ){.
21050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
21060 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
21070 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b  ( nLen+1<nBuf ){
21080 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c  .        zBuf[nL
21090 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53  en] = winGetDirS
210a0 65 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  ep();.        zB
210b0 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30  uf[nLen+1] = '\0
210c0 27 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ';.        retur
210d0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
210e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
210f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
21100 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
21110 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f  ile name and sto
21120 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  re the resulting
21130 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a   pointer into pz
21140 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  Buf..** The poin
21150 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20  ter returned in 
21160 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66 72  pzBuf must be fr
21170 65 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  eed via sqlite3_
21180 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  free()..*/.stati
21190 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70  c int winGetTemp
211a0 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
211b0 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70   *pVfs, char **p
211c0 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
211d0 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
211e0 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
211f0 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
21200 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
21210 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
21220 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
21230 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20  9";.  size_t i, 
21240 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20  j;.  int nPre = 
21250 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
21260 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
21270 5f 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20  _PREFIX);.  int 
21280 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72  nMax, nBuf, nDir
21290 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a  , nLen;.  char *
212a0 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zBuf;..  /* It's
212b0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
212c0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
212d0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
212e0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
212f0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
21300 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
21310 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
21320 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
21330 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
21340 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
21350 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
21360 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
21370 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20  _IOERR );..  /* 
21380 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f  Allocate a tempo
21390 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 73  rary buffer to s
213a0 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71  tore the fully q
213b0 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20  ualified file.  
213c0 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ** name for the 
213d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
213e0 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
213f0 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e  we cannot contin
21400 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20  ue..  */.  nMax 
21410 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
21420 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20  me; nBuf = nMax 
21430 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71  + 2;.  zBuf = sq
21440 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
21450 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21   nBuf );.  if( !
21460 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52  zBuf ){.    OSTR
21470 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
21480 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
21490 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
214a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
214b0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
214c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20   }..  /* Figure 
214d0 6f 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76  out the effectiv
214e0 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
214f0 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63  ctory.  First, c
21500 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a  heck if one.  **
21510 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63   has been explic
21520 69 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20  itly set by the 
21530 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68  application; oth
21540 65 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20  erwise, use the 
21550 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  one.  ** configu
21560 72 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61  red by the opera
21570 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a  ting system..  *
21580 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20  /.  nDir = nMax 
21590 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20  - (nPre + 15);. 
215a0 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20   assert( nDir>0 
215b0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
215c0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
215d0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c  ){.    int nDirL
215e0 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
215f0 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d  en30(sqlite3_tem
21600 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
21610 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20    if( nDirLen>0 
21620 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 77 69  ){.      if( !wi
21630 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69 74 65  nIsDirSep(sqlite
21640 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
21650 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a  [nDirLen-1]) ){.
21660 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b          nDirLen+
21670 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
21680 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69   if( nDirLen>nDi
21690 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
216a0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
216b0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
216c0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
216d0 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52   rc=SQLITE_ERROR
216e0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72  \n"));.        r
216f0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
21700 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
21710 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
21720 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  me1", 0);.      
21730 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
21740 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
21750 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  Buf, "%s", sqlit
21760 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
21770 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  y);.    }.  }.#i
21780 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
21790 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20  IN__).  else{.  
217a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
217b0 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
217c0 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  {.       0, /* g
217d0 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
217e0 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
217f0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
21800 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20  MPDIR") */.     
21810 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
21820 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  TMP") */.       
21830 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45  0, /* getenv("TE
21840 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
21850 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45  , /* getenv("USE
21860 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20  RPROFILE") */.  
21870 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
21880 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  .       "/usr/tm
21890 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70  p",.       "/tmp
218a0 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20  ",.       ".",. 
218b0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f        0        /
218c0 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
218d0 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  r */.    };.    
218e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
218f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
21900 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69  zDir = 0;..    i
21910 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20  f( !azDirs[0] ) 
21920 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65  azDirs[0] = gete
21930 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
21940 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  R");.    if( !az
21950 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
21960 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
21970 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20  PDIR");.    if( 
21980 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44  !azDirs[2] ) azD
21990 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28  irs[2] = getenv(
219a0 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  "TMP");.    if( 
219b0 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44  !azDirs[3] ) azD
219c0 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28  irs[3] = getenv(
219d0 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28  "TEMP");.    if(
219e0 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a   !azDirs[4] ) az
219f0 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76  Dirs[4] = getenv
21a00 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b  ("USERPROFILE");
21a10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21a20 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73  sizeof(azDirs)/s
21a30 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29  izeof(azDirs[0])
21a40 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b  ; zDir=azDirs[i+
21a50 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  +]){.      void 
21a60 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20  *zConverted;.   
21a70 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29     if( zDir==0 )
21a80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21a90 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   /* If the path 
21aa0 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
21ab0 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f  ive letter follo
21ac0 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e  wed by the colon
21ad0 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63  .      ** charac
21ae0 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69  ter, assume it i
21af0 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69  s already a nati
21b00 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f  ve Win32 path; o
21b10 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
21b20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f  ** it must be co
21b30 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74  nverted to a nat
21b40 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 76  ive Win32 path v
21b50 69 61 20 74 68 65 20 43 79 67 77 69 6e 20 41 50  ia the Cygwin AP
21b60 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72  I.      ** prior
21b70 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20   to using it..  
21b80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
21b90 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
21ba0 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20  rAndColon(zDir) 
21bb0 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76  ){.        zConv
21bc0 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
21bd0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
21be0 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  me(zDir);.      
21bf0 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65    if( !zConverte
21c00 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
21c10 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
21c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
21c30 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
21c40 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
21c50 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
21c60 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21c70 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
21c80 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OMEM;.        }.
21c90 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49          if( winI
21ca0 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
21cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
21cc0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
21cd0 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
21ce0 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20   zDir);.        
21cf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21d00 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
21d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
21d30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
21d40 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  verted);.      }
21d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
21d60 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74  onverted = sqlit
21d70 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
21d80 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ax+1 );.        
21d90 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20  if( !zConverted 
21da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21db0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
21dc0 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41  .          OSTRA
21dd0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
21de0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
21df0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
21e00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
21e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21e20 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
21e30 20 20 20 20 20 20 69 66 28 20 63 79 67 77 69 6e        if( cygwin
21e40 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
21e50 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 49 73              osIs
21e60 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58  NT() ? CCP_POSIX
21e70 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f  _TO_WIN_W : CCP_
21e80 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20  POSIX_TO_WIN_A, 
21e90 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20  zDir,.          
21ea0 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
21eb0 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20  , nMax+1)<0 ){. 
21ec0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21ed0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
21ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
21ef0 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
21f00 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41  .          OSTRA
21f10 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
21f20 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
21f30 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29  RR_CONVPATH\n"))
21f40 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
21f50 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
21f60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
21f70 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72  PATH, (DWORD)err
21f80 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fa0 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
21fb0 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20  2", zDir);.     
21fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
21fd0 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
21fe0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
21ff0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
22000 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65  int, we know the
22010 20 63 61 6e 64 69 64 61 74 65 20 64 69 72 65 63   candidate direc
22020 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e 64 20  tory exists and 
22030 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20  should.         
22040 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f   ** be used.  Ho
22050 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65  wever, we may ne
22060 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68  ed to convert th
22070 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  e string contain
22080 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
22090 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55   its name into U
220a0 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74  TF-8 (i.e. if it
220b0 20 69 73 20 55 54 46 2d 31 36 20 72 69 67 68 74   is UTF-16 right
220c0 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20   now)..         
220d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68   */.          ch
220e0 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43  ar *zUtf8 = winC
220f0 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65  onvertToUtf8File
22100 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  name(zConverted)
22110 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22120 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
22130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22140 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
22150 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
22160 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
22170 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52              OSTR
22180 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22190 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
221a0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
221b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
221c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
221d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
221e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
221f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
22200 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
22210 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20  zUtf8);.        
22220 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22230 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20  Utf8);.         
22240 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
22250 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22260 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
22280 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
22290 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a  erted);.      }.
222a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20      }.  }.#elif 
222b0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
222c0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
222d0 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20  YGWIN__).  else 
222e0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
222f0 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69      char *zMulti
22300 3b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69  ;.    LPWSTR zWi
22310 64 65 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  dePath = sqlite3
22320 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78  MallocZero( nMax
22330 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29  *sizeof(WCHAR) )
22340 3b 0a 20 20 20 20 69 66 28 20 21 7a 57 69 64 65  ;.    if( !zWide
22350 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71  Path ){.      sq
22360 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22370 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22380 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22390 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
223a0 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
223b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
223c0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
223d0 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74   }.    if( osGet
223e0 54 65 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c 20  TempPathW(nMax, 
223f0 7a 57 69 64 65 50 61 74 68 29 3d 3d 30 20 29 7b  zWidePath)==0 ){
22400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
22410 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  ree(zWidePath);.
22420 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22430 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
22440 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
22450 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
22460 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
22470 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
22480 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
22490 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
224a0 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47  GETTEMPPATH, osG
224b0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
224e0 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20  empname2", 0);. 
224f0 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20     }.    zMulti 
22500 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
22510 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  f8(zWidePath);. 
22520 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b     if( zMulti ){
22530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
22540 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
22550 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69  uf, "%s", zMulti
22560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22570 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20  _free(zMulti);. 
22580 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22590 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
225a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
225b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64  qlite3_free(zWid
225c0 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71  ePath);.      sq
225d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
225e0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
225f0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22600 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22610 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
22620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22630 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
22640 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
22650 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
22660 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
22670 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
22680 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68   char *zMbcsPath
22690 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
226a0 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20  Zero( nMax );.  
226b0 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68    if( !zMbcsPath
226c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
226d0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
226e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
226f0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
22700 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
22710 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
22720 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22730 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
22740 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
22750 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63  PathA(nMax, zMbc
22760 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  sPath)==0 ){.   
22770 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22780 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
22790 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
227a0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
227b0 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
227c0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
227d0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
227e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
227f0 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c  TEMPPATH, osGetL
22800 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
22830 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20  name3", 0);.    
22840 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71  }.    zUtf8 = sq
22850 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
22860 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61  _to_utf8(zMbcsPa
22870 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  th);.    if( zUt
22880 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
22890 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61  te3_snprintf(nMa
228a0 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a  x, zBuf, "%s", z
228b0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
228c0 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
228d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
228e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
228f0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
22900 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
22910 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
22920 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
22930 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
22940 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22950 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
22960 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
22970 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23  32_HAS_ANSI */.#
22980 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
22990 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20  _OS_WINRT */..  
229a0 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  /*.  ** Check to
229b0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
229c0 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
229d0 72 79 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20  ry ends with an 
229e0 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a  appropriate.  **
229f0 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20   separator.  If 
22a00 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20  it does not and 
22a10 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f  there is not eno
22a20 75 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 74  ugh space left t
22a30 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20  o add.  ** one, 
22a40 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  fail..  */.  if(
22a50 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69   !winMakeEndInDi
22a60 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75  rSep(nDir+1, zBu
22a70 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  f) ){.    sqlite
22a80 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22a90 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
22aa0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
22ab0 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
22ac0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22ad0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
22ae0 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
22af0 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20  empname4", 0);. 
22b00 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68   }..  /*.  ** Ch
22b10 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
22b20 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
22b30 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
22b40 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
22b50 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20  e .  ** name in 
22b60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
22b70 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rmat:.  **.  ** 
22b80 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69    "<temporary_di
22b90 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f  rectory>/etilqs_
22ba0 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58 5c  XXXXXXXXXXXXXXX\
22bb0 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  0\0".  **.  ** I
22bc0 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  f not, return SQ
22bd0 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68 65  LITE_ERROR.  The
22be0 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75 73   number 17 is us
22bf0 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72  ed here in order
22c00 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74   to.  ** account
22c10 20 66 6f 72 20 74 68 65 20 73 70 61 63 65 20 75   for the space u
22c20 73 65 64 20 62 79 20 74 68 65 20 31 35 20 63 68  sed by the 15 ch
22c30 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20 73  aracter random s
22c40 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20 20  uffix and the.  
22c50 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67 20  ** two trailing 
22c60 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e 20  NUL characters. 
22c70 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65 63   The final direc
22c80 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63  tory separator c
22c90 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68 61  haracter.  ** ha
22ca0 73 20 61 6c 72 65 61 64 79 20 61 64 64 65 64 20  s already added 
22cb0 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c  if it was not al
22cc0 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a 20  ready present.. 
22cd0 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c   */.  nLen = sql
22ce0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75  ite3Strlen30(zBu
22cf0 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20  f);.  if( (nLen 
22d00 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20 6e  + nPre + 17) > n
22d10 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Buf ){.    sqlit
22d20 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
22d30 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22d40 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22d50 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
22d60 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
22d70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
22d80 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74  RROR, 0, "winGet
22d90 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a  Tempname5", 0);.
22da0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73    }..  sqlite3_s
22db0 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d  nprintf(nBuf-16-
22dc0 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c  nLen, zBuf+nLen,
22dd0 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c   SQLITE_TEMP_FIL
22de0 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20  E_PREFIX);..  j 
22df0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
22e00 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74  0(zBuf);.  sqlit
22e10 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35  e3_randomness(15
22e20 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66  , &zBuf[j]);.  f
22e30 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
22e40 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75  +, j++){.    zBu
22e50 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
22e60 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
22e70 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
22e80 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
22e90 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a   ];.  }.  zBuf[j
22ea0 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b  ] = 0;.  zBuf[j+
22eb0 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66  1] = 0;.  *pzBuf
22ec0 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52   = zBuf;..  OSTR
22ed0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
22ee0 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  AME name=%s, rc=
22ef0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42  SQLITE_OK\n", zB
22f00 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  uf));.  return S
22f10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22f20 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
22f30 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  f the named file
22f40 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72   is really a dir
22f50 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20  ectory.  Return 
22f60 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69  false if.** it i
22f70 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
22f80 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f  r than a directo
22f90 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20  ry, or if there 
22fa0 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d  is any kind of m
22fb0 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  emory.** allocat
22fc0 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a  ion failure..*/.
22fd0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73  static int winIs
22fe0 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  Dir(const void *
22ff0 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44  zConverted){.  D
23000 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
23010 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
23020 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69   lastErrno;..  i
23030 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
23040 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
23050 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41      WIN32_FILE_A
23060 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41  TTRIBUTE_DATA sA
23070 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ttrData;.    mem
23080 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
23090 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
230a0 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65  ata));.    while
230b0 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69  ( !(rc = osGetFi
230c0 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28  leAttributesExW(
230d0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
230e0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53    GetFileExInfoS
23110 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20  tandard,.       
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
23140 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f  )) && winRetryIo
23150 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
23160 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
23170 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72  ( !rc ){.      r
23180 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61  eturn 0; /* Inva
23190 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20  lid name? */.   
231a0 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41   }.    attr = sA
231b0 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
231c0 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51  tributes;.#if SQ
231d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
231e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74  .  }else{.    at
231f0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
23200 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
23210 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
23220 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
23230 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44  n (attr!=INVALID
23240 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
23250 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f  ) && (attr&FILE_
23260 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
23270 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ORY);.}../*.** O
23280 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
23290 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
232a0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
232b0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
232c0 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d 61  * Used to get ma
232d0 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d 65 20  ximum path name 
232e0 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f 6e 73  length */.  cons
232f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
23300 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
23310 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
23320 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
23330 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
23340 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
23350 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
23360 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
23370 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
23380 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
23390 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
233a0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
233b0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
233c0 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
233d0 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
233e0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
233f0 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64  o = 0;.  DWORD d
23400 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a  wDesiredAccess;.
23410 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d    DWORD dwShareM
23420 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43  ode;.  DWORD dwC
23430 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
23440 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  on;.  DWORD dwFl
23450 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
23460 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45   = 0;.#if SQLITE
23470 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
23480 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64  isTemp = 0;.#end
23490 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
234a0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
234b0 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  id;.  void *zCon
234c0 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  verted;         
234d0 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
234e0 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20   in OS encoding 
234f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23500 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61  *zUtf8Name = zNa
23510 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  me; /* Filename 
23520 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e  in UTF-8 encodin
23530 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d  g */.  int cnt =
23540 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   0;..  /* If arg
23550 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
23560 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
23570 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
23580 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
23590 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
235a0 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
235b0 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
235c0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
235d0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a  n..  */.  char *
235e0 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a  zTmpname = 0; /*
235f0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
23600 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65  ilename, if nece
23610 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74  ssary. */..  int
23620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23640 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
23650 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ode */.#if !defi
23660 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53  ned(NDEBUG) || S
23670 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
23680 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
23690 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
236a0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
236b0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  to open */.#endi
236c0 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  f..  int isExclu
236d0 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
236e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
236f0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
23700 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
23710 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
23720 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
23730 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
23740 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
23750 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
23760 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
23770 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
23780 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
23790 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
237a0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
237b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
237c0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
237d0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
237e0 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75  .  int isOpenJou
237f0 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65  rnal = (isCreate
23800 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
23810 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
23820 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
23830 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
23840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
23850 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
23860 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23870 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23  OPEN_WAL.  ));.#
23880 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
23890 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  (("OPEN name=%s,
238a0 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73   pFile=%p, flags
238b0 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25  =%x, pOutFlags=%
238c0 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
238d0 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20   zUtf8Name, id, 
238e0 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  flags, pOutFlags
238f0 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ));..  /* Check 
23900 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
23910 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
23920 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
23930 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
23940 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
23950 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
23960 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
23970 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
23980 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
23990 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
239a0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
239b0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
239c0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
239d0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
239e0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
239f0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
23a00 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
23a10 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
23a20 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
23a30 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
23a40 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
23a50 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
23a60 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
23a70 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
23a80 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
23a90 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
23aa0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
23ab0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
23ac0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
23ad0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
23ae0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
23af0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
23b00 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
23b10 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
23b20 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
23b30 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
23b40 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
23b50 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
23b60 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
23b70 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
23b80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
23b90 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
23ba0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
23bb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
23bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
23bd0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
23be0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
23bf0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
23c00 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
23c10 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
23c20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
23c30 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
23c40 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
23c50 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
23c60 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
23c70 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
23c80 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
23c90 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
23ca0 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
23cb0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
23cc0 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
23cd0 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
23ce0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
23cf0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
23d00 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
23d10 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
23d20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
23d30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
23d40 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
23d50 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
23d60 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
23d70 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
23d80 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
23d90 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
23da0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
23db0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
23dc0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
23dd0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
23de0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
23df0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
23e00 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  .  );..  assert(
23e10 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d   pFile!=0 );.  m
23e20 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
23e30 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29  sizeof(winFile))
23e40 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49  ;.  pFile->h = I
23e50 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
23e60 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  LUE;..#if SQLITE
23e70 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
23e80 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73  !zUtf8Name && !s
23e90 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
23ea0 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
23eb0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
23ec0 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22  ERROR,.        "
23ed0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
23ee0 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20  ectory variable 
23ef0 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f  should be set fo
23f00 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23  r WinRT");.  }.#
23f10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
23f20 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
23f30 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
23f40 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e  ion is NULL, gen
23f50 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65  erate a .  ** te
23f60 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
23f70 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20  e to use .  */. 
23f80 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
23f90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
23fa0 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
23fb0 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  enJournal );.   
23fc0 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
23fd0 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70  name(pVfs, &zTmp
23fe0 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
23ff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24000 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
24010 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
24020 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  =%s", zUtf8Name,
24030 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
24040 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
24050 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24060 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
24070 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
24080 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
24090 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
240a0 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
240b0 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
240c0 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
240d0 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
240e0 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
240f0 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
24100 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75  o.  ** sqlite3_u
24110 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a  ri_parameter()..
24120 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
24130 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
24140 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28  EN_MAIN_DB) || (
24150 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24160 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20  PEN_URI) ||.    
24170 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c     zUtf8Name[sql
24180 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74  ite3Strlen30(zUt
24190 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  f8Name)+1]==0 );
241a0 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
241b0 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
241c0 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
241d0 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
241e0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
241f0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
24200 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
24210 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
24220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
24230 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
24240 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
24250 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
24260 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24270 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  M", zUtf8Name));
24280 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24290 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
242a0 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73    }..  if( winIs
242b0 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
242c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
242d0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
242e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
242f0 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
24300 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
24310 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
24320 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
24330 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  R", zUtf8Name));
24340 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24350 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
24360 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  R;.  }..  if( is
24370 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
24380 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24390 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
243a0 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
243b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
243c0 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
243d0 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
243e0 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  }..  /* SQLITE_O
243f0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
24400 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
24410 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
24420 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61  le is .  ** crea
24430 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73  ted. SQLite does
24440 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e  n't use it to in
24450 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76  dicate "exclusiv
24460 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20  e access" .  ** 
24470 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79  as it is usually
24480 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a   understood..  *
24490 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  /.  if( isExclus
244a0 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72  ive ){.    /* Cr
244b0 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65  eates a new file
244c0 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65  , only if it doe
244d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
244e0 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  ist. */.    /* I
244f0 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
24500 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  s, it fails. */.
24510 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
24520 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41  sposition = CREA
24530 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20  TE_NEW;.  }else 
24540 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a  if( isCreate ){.
24550 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73      /* Open exis
24560 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72  ting file, or cr
24570 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e  eate if it doesn
24580 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20  't exist */.    
24590 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
245a0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
245b0 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AYS;.  }else{.  
245c0 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c    /* Opens a fil
245d0 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78  e, only if it ex
245e0 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ists. */.    dwC
245f0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
24600 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49  on = OPEN_EXISTI
24610 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61  NG;.  }..  dwSha
24620 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
24630 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
24640 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20  SHARE_WRITE;..  
24650 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
24660 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
24670 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
24680 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
24690 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
246a0 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70  DDEN;.    isTemp
246b0 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 1;.#else.    
246c0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
246d0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
246e0 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
24710 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
24720 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
24750 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
24760 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  E;.#endif.  }els
24770 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
24780 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
24790 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
247a0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  MAL;.  }.  /* Re
247b0 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
247c0 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
247d0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
247e0 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
247f0 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
24800 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
24810 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
24820 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c  2699. */.#if SQL
24830 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64  ITE_OS_WINCE.  d
24840 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
24850 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
24860 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
24870 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73  #endif..  if( os
24880 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
24890 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
248a0 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58    CREATEFILE2_EX
248b0 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
248c0 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65  S extendedParame
248d0 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64  ters;.    extend
248e0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
248f0 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45  ize = sizeof(CRE
24900 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
24910 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20  D_PARAMETERS);. 
24920 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
24930 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72  eters.dwFileAttr
24940 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20  ibutes =.       
24950 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
24960 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
24970 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b  _ATTRIBUTE_MASK;
24980 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
24990 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c  ameters.dwFileFl
249a0 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64  ags = dwFlagsAnd
249b0 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
249c0 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20  E_FLAG_MASK;.   
249d0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
249e0 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f  ers.dwSecurityQo
249f0 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54  sFlags = SECURIT
24a00 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20  Y_ANONYMOUS;.   
24a10 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
24a20 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74  ers.lpSecurityAt
24a30 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b  tributes = NULL;
24a40 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
24a50 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74  ameters.hTemplat
24a60 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  eFile = NULL;.  
24a70 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
24a80 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43  CreateFile2((LPC
24a90 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
24aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24ac0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24af0 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b10 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
24b20 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65                &e
24b50 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24b60 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  s))==INVALID_HAN
24b70 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
24ba0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
24bb0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
24bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24bd0 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
24be0 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28  lse.    while( (
24bf0 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
24c00 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
24c10 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
24c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c30 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
24c40 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
24c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c60 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
24c70 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c90 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
24ca0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cc0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
24cd0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
24ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
24d00 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
24d10 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
24d40 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
24d50 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
24d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24d70 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23   Noop */.    }.#
24d80 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
24d90 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
24da0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
24db0 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
24dc0 73 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50  sCreateFileA((LP
24dd0 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  CSTR)zConverted,
24de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
24e00 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
24e30 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
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 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
24e70 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
24ea0 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
24eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ec0 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d          NULL))==
24ed0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
24ee0 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f00 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f        winRetryIo
24f10 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
24f20 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
24f30 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
24f40 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  */.    }.  }.#en
24f50 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72  dif.  winLogIoer
24f60 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41  r(cnt);..  OSTRA
24f70 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
24f80 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
24f90 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22  ss=%lx, rc=%s\n"
24fa0 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a  , h, zUtf8Name,.
24fb0 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
24fc0 69 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d  iredAccess, (h==
24fd0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
24fe0 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
24ff0 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66   : "ok"));..  if
25000 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
25010 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
25020 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
25030 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
25040 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
25050 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
25060 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
25070 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74  , "winOpen", zUt
25080 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  f8Name);.    sql
25090 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
250a0 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
250b0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
250c0 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61  );.    if( isRea
250d0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
250e0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
250f0 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70  return winOpen(p
25100 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20  Vfs, zName, id, 
25110 0a 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67  .         ((flag
25120 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
25130 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20  ADONLY) &.      
25140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
25150 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
25160 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
25170 52 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20  READWRITE)),.   
25180 20 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29        pOutFlags)
25190 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
251a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
251b0 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
251c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
251d0 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
251e0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
251f0 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  e ){.      *pOut
25200 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
25210 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
25220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25230 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
25240 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
25250 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
25260 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66  OSTRACE(("OPEN f
25270 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c  ile=%p, name=%s,
25280 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75   access=%lx, pOu
25290 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74  tFlags=%p, *pOut
252a0 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20  Flags=%d, ".    
252b0 20 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22         "rc=%s\n"
252c0 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  , h, zUtf8Name, 
252d0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
252e0 20 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74   pOutFlags, pOut
252f0 46 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20  Flags ?.        
25300 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20     *pOutFlags : 
25310 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  0, (h==INVALID_H
25320 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
25330 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
25340 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
25350 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52  _WINCE.  if( isR
25360 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70  eadWrite && eTyp
25370 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
25380 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26  AIN_DB.       &&
25390 20 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61   (rc = winceCrea
253a0 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46  teLock(zName, pF
253b0 69 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ile))!=SQLITE_OK
253c0 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  .  ){.    osClos
253d0 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20  eHandle(h);.    
253e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
253f0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
25400 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
25410 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
25420 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b  E(("OPEN-CE-LOCK
25430 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c   name=%s, rc=%s\
25440 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  n", zName, sqlit
25450 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
25460 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
25470 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70    }.  if( isTemp
25480 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a   ){.    pFile->z
25490 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20  DeleteOnClose = 
254a0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65  zConverted;.  }e
254b0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
254c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
254d0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
254e0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
254f0 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46  (zTmpname);.  pF
25500 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26  ile->pMethod = &
25510 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70  winIoMethod;.  p
25520 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66  File->pVfs = pVf
25530 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  s;.  pFile->h = 
25540 68 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  h;.  if( isReado
25550 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  nly ){.    pFile
25560 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
25570 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  INFILE_RDONLY;. 
25580 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
25590 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61  _uri_boolean(zNa
255a0 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49  me, "psow", SQLI
255b0 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TE_POWERSAFE_OVE
255c0 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70  RWRITE) ){.    p
255d0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
255e0 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b  |= WINFILE_PSOW;
255f0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61  .  }.  pFile->la
25600 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
25610 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61  OR;.  pFile->zPa
25620 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20  th = zName;.#if 
25630 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
25640 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e  SIZE>0.  pFile->
25650 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70  hMap = NULL;.  p
25660 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
25670 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
25680 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mapSize = 0;.  p
25690 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
256a0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c  tual = 0;.  pFil
256b0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
256c0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
256d0 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e  nfig.szMmap;.#en
256e0 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  dif..  OpenCount
256f0 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
25700 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
25710 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
25720 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ile..**.** Note 
25730 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65  that Windows doe
25740 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69  s not allow a fi
25750 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  le to be deleted
25760 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a   if some other.*
25770 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69 74  * process has it
25780 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65   open.  Sometime
25790 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65  s a virus scanne
257a0 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72  r or indexing pr
257b0 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70  ogram.** will op
257c0 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
257d0 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20  e shortly after 
257e0 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  it is created in
257f0 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20   order to do.** 
25800 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65 73  whatever it does
25810 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74  .  While this ot
25820 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
25830 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  olding the.** fi
25840 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c  le open, we will
25850 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65   be unable to de
25860 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72  lete it.  To wor
25870 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a  k around this.**
25880 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c   problem, we del
25890 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  ay 100 milliseco
258a0 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64  nds and try to d
258b0 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70  elete again.  Up
258c0 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49  .** to MX_DELETI
258d0 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65  ON_ATTEMPTs dele
258e0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72  tion attempts ar
258f0 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76  e run before giv
25900 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65  ing.** up and re
25910 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
25920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25930 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c  winDelete(.  sql
25940 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
25950 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
25960 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f  used on win32 */
25970 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25980 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f  Filename,      /
25990 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
259a0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
259b0 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20  t syncDir       
259c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
259d0 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
259e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  /.){.  int cnt =
259f0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
25a00 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57  DWORD attr;.  DW
25a10 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
25a20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  0;.  void *zConv
25a30 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
25a40 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
25a50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
25a60 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20  TER(syncDir);.. 
25a70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
25a80 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
25a90 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
25aa0 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
25ab0 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69   name=%s, syncDi
25ac0 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  r=%d\n", zFilena
25ad0 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a  me, syncDir));..
25ae0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
25af0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
25b00 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
25b10 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
25b20 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
25b30 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
25b40 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  E name=%s, rc=SQ
25b50 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
25b60 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  \n", zFilename))
25b70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25b80 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
25b90 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
25ba0 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  T() ){.    do {.
25bb0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
25bc0 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f  NRT.      WIN32_
25bd0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
25be0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
25bf0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74       memset(&sAt
25c00 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
25c10 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
25c20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46       if ( osGetF
25c30 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
25c40 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74  (zConverted, Get
25c50 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
25c60 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
25c90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  ) ){.        att
25ca0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
25cb0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
25cc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25cd0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
25ce0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
25cf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
25d00 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
25d10 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
25d20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
25d30 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
25d40 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
25d50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25d60 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
25d70 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
25d80 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
25d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25da0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25db0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
25dc0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
25dd0 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
25de0 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
25df0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
25e00 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  (zConverted);.#e
25e10 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 20  ndif.      if ( 
25e20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
25e30 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
25e40 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
25e50 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
25e60 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
25e70 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
25e80 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
25e90 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
25ea0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
25eb0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
25ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25ed0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
25ee0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
25ef0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
25f00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25f10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25f20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
25f40 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25f50 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
25f60 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
25f70 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
25f80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
25f90 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
25fa0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
25fb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25fc0 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
25fd0 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
25fe0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
25ff0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
26000 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
26010 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26020 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
26030 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
26040 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
26050 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
26060 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
26070 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
26080 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
26090 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
260a0 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
260b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
260c0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
260d0 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a   else{.    do {.
260e0 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
260f0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
26100 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  A(zConverted);. 
26110 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
26120 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
26130 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
26140 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
26150 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
26160 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
26170 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
26180 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
26190 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
261a0 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
261b0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
261c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
261d0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
261e0 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
261f0 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
26200 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
26220 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
26230 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
26250 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
26260 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
26270 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
26280 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
26290 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
262a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
262b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
262c0 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28  ( osDeleteFileA(
262d0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
262e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
262f0 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
26300 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
26310 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26320 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
26330 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
26340 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
26350 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
26360 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
26370 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
26380 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
26390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
263a0 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  ile(1);.  }.#end
263b0 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  if.  if( rc && r
263c0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
263d0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a  DELETE_NOENT ){.
263e0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
263f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
26400 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
26410 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65 22  rno, "winDelete"
26420 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
26430 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f  }else{.    winLo
26440 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d  gIoerr(cnt);.  }
26450 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
26460 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f  zConverted);.  O
26470 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
26480 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
26490 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  ", zFilename, sq
264a0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
264b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
264c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
264d0 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 61 6e  the existence an
264e0 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66 69  d status of a fi
264f0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
26500 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20 73  t winAccess(.  s
26510 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
26520 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  ,         /* Not
26530 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
26540 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26550 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f  zFilename,     /
26560 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
26570 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
26580 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
26590 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
265a0 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20  of test to make 
265b0 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
265c0 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265e0 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29  OUT: Result */.)
265f0 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
26600 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
26610 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
26620 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  = 0;.  void *zCo
26630 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
26640 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
26650 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  );..  SimulateIO
26660 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
26670 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
26680 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  S; );.  OSTRACE(
26690 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
266a0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52 65 73  , flags=%x, pRes
266b0 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  Out=%p\n",.     
266c0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
266d0 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29   flags, pResOut)
266e0 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64  );..  zConverted
266f0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
26700 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
26710 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
26720 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
26730 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
26740 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72  CCESS name=%s, r
26750 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
26760 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  OMEM\n", zFilena
26770 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
26780 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
26790 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  MEM;.  }.  if( o
267a0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
267b0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
267c0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
267d0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
267e0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
267f0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
26800 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
26810 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
26820 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
26830 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
26840 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
26850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
26870 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
26880 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ard, .          
26890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268a0 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20     &sAttrData)) 
268b0 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  && winRetryIoerr
268c0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
268d0 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72  o) ){}.    if( r
268e0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f  c ){.      /* Fo
268f0 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45  r an SQLITE_ACCE
26900 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c  SS_EXISTS query,
26910 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65   treat a zero-le
26920 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20  ngth file.      
26930 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73  ** as if it does
26940 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
26950 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20    */.      if(  
26960 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f    flags==SQLITE_
26970 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20  ACCESS_EXISTS.  
26980 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
26990 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69  Data.nFileSizeHi
269a0 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  gh==0 .         
269b0 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
269c0 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b  ileSizeLow==0 ){
269d0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
269e0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
269f0 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
26a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
26a10 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
26a20 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
26a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
26a40 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  se{.      winLog
26a50 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20  Ioerr(cnt);.    
26a60 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21    if( lastErrno!
26a70 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
26a80 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72  FOUND && lastErr
26a90 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no!=ERROR_PATH_N
26aa0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
26ab0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26ac0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
26ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
26ae0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
26af0 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61  IOERR_ACCESS, la
26b00 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63  stErrno, "winAcc
26b10 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ess",.          
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b30 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
26b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26b50 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
26b60 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
26b70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26b80 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
26b90 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
26ba0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74  .  else{.    att
26bb0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
26bc0 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
26bd0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d  zConverted);.  }
26be0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
26bf0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
26c00 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c  d);.  switch( fl
26c10 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
26c20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
26c30 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  AD:.    case SQL
26c40 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
26c50 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  S:.      rc = at
26c60 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
26c70 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
26c80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
26c90 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
26ca0 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
26cb0 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
26cc0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
26cd0 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20  UTES &&.        
26ce0 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c       (attr & FIL
26cf0 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44  E_ATTRIBUTE_READ
26d00 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ONLY)==0;.      
26d10 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
26d20 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
26d30 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73  (!"Invalid flags
26d40 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d   argument");.  }
26d50 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63  .  *pResOut = rc
26d60 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43  ;.  OSTRACE(("AC
26d70 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52  CESS name=%s, pR
26d80 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f  esOut=%p, *pResO
26d90 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45  ut=%d, rc=SQLITE
26da0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
26db0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52     zFilename, pR
26dc0 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
26dd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26de0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26df0 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
26e00 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
26e10 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  d path name star
26e20 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20  ts with a drive 
26e30 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  letter.** follow
26e40 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68  ed by a colon ch
26e50 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
26e60 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69  ic BOOL winIsDri
26e70 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
26e80 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
26e90 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72  zPathname.){.  r
26ea0 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49  eturn ( sqlite3I
26eb0 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65  salpha(zPathname
26ec0 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d  [0]) && zPathnam
26ed0 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a  e[1]==':' );.}..
26ee0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  /*.** Returns no
26ef0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
26f00 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d  ecified path nam
26f10 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  e should be used
26f20 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a   verbatim.  If.*
26f30 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  * non-zero is re
26f40 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73  turned from this
26f50 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63   function, the c
26f60 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
26f70 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75  must simply.** u
26f80 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  se the provided 
26f90 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74  path name verbat
26fa0 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20  im -OR- resolve 
26fb0 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  it into a full p
26fc0 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e  ath name.** usin
26fd0 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74  g the GetFullPat
26fe0 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20  hName Win32 API 
26ff0 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61  function (if ava
27000 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74  ilable)..*/.stat
27010 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72  ic BOOL winIsVer
27020 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20  batimPathname(. 
27030 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
27040 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20  thname.){.  /*. 
27050 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
27060 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
27070 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68   a forward slash
27080 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c   or a backslash,
27090 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20   it is either.  
270a0 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e  ** a legal UNC n
270b0 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65  ame, a volume re
270c0 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20  lative path, or 
270d0 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
270e0 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a   name in the.  *
270f0 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20  * "Unix" format 
27100 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65  on Windows.  The
27110 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61  re is no easy wa
27120 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61  y to differentia
27130 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  te between.  ** 
27140 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61  the final two ca
27150 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ses; therefore, 
27160 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  we return the sa
27170 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  fer return value
27180 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f   of TRUE.  ** so
27190 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66   that callers of
271a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
271b0 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69  ill simply use i
271c0 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f  t verbatim..  */
271d0 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 69 72  .  if ( winIsDir
271e0 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  Sep(zPathname[0]
271f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27200 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  TRUE;.  }..  /*.
27210 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
27220 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
27230 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61  h a letter and a
27240 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74   colon it is eit
27250 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a  her a volume.  *
27260 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  * relative path 
27270 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
27280 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66  ath.  Callers of
27290 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
272a0 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74  ust not.  ** att
272b0 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74  empt to treat it
272c0 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70   as a relative p
272d0 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74  ath name (i.e. t
272e0 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c  hey should simpl
272f0 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65  y use.  ** it ve
27300 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20  rbatim)..  */.  
27310 69 66 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c  if ( winIsDriveL
27320 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50  etterAndColon(zP
27330 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20  athname) ){.    
27340 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
27350 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77  ..  /*.  ** If w
27360 65 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  e get to this po
27370 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61  int, the path na
27380 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74  me should almost
27390 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20   certainly be a 
273a0 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61  purely.  ** rela
273b0 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e  tive one (i.e. n
273c0 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e  ot a UNC name, n
273d0 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64  ot absolute, and
273e0 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61   not volume rela
273f0 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65  tive)..  */.  re
27400 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f  turn FALSE;.}../
27410 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61  *.** Turn a rela
27420 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e  tive pathname in
27430 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61  to a full pathna
27440 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66  me.  Write the f
27450 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20  ull.** pathname 
27460 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f  into zOut[].  zO
27470 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20  ut[] will be at 
27480 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61  least pVfs->mxPa
27490 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20  thname.** bytes 
274a0 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
274b0 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61  ic int winFullPa
274c0 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
274d0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
274e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
274f0 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
27500 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
27510 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20   *zRelative,    
27520 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
27530 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70  relative input p
27540 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75  ath */.  int nFu
27550 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
27560 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
27570 66 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  f output buffer 
27580 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
27590 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20  ar *zFull       
275a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
275b0 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
275c0 29 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65  ){.  .#if define
275d0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
275e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
275f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27600 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44  RROR );.  UNUSED
27610 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c  _PARAMETER(nFull
27620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75  );.  assert( nFu
27630 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll>=pVfs->mxPath
27640 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73  name );.  if ( s
27650 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
27660 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
27670 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
27680 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
27690 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
276a0 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
276b0 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
276c0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
276d0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
276e0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
276f0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
27700 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
27710 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
27720 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
27730 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
27740 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
27750 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
27760 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
27770 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
27780 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
27790 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20   and a slash..  
277a0 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a    */.    char *z
277b0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Out = sqlite3Mal
277c0 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d  locZero( pVfs->m
277d0 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20  xPathname+1 );. 
277e0 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a     if( !zOut ){.
277f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27800 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
27810 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
27820 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
27830 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73  .            (os
27840 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
27850 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
27860 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
27870 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
27880 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52  CCP_RELATIVE, zR
27890 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70  elative, zOut, p
278a0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
278b0 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  1)<0 ){.      sq
278c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
278d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
278e0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
278f0 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
27900 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
27910 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
27920 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
27930 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
27940 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
27950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
27960 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
27970 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
27980 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ame(zOut);.     
27990 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
279a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
279b0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
279c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
279d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
279e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
279f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
27a00 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
27a10 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
27a20 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a40 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
27a50 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
27a60 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74 66 38  tDirSep(), zUtf8
27a70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27a80 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
27a90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27aa0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
27ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
27ac0 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4d  *zOut = sqlite3M
27ad0 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d  allocZero( pVfs-
27ae0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b  >mxPathname+1 );
27af0 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74 20 29  .    if( !zOut )
27b00 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
27b10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
27b20 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  M;.    }.    if(
27b30 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
27b40 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  h(.            (
27b50 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
27b60 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
27b70 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
27b80 5f 41 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _A),.           
27b90 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
27ba0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
27bb0 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
27bc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
27bd0 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
27be0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
27bf0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
27c00 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
27c10 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
27c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
27c30 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
27c40 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
27c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27c60 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
27c70 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
27c80 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
27c90 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
27ca0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
27cb0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27cd0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
27ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
27cf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27d00 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
27d10 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
27d20 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  ull, "%s", zUtf8
27d30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d40 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
27d50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27d60 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  (zOut);.    }.  
27d70 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
27d80 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
27d90 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f (SQLITE_OS_WIN
27da0 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
27db0 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e  WINRT) && !defin
27dc0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
27dd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
27de0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
27df0 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69  ERROR );.  /* Wi
27e00 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
27e10 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
27e20 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
27e30 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
27e40 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f   /* WinRT has no
27e50 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   way to convert 
27e60 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
27e70 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f  to an absolute o
27e80 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ne. */.  if ( sq
27e90 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
27ea0 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
27eb0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
27ec0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
27ed0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
27ee0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
27ef0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
27f00 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
27f10 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
27f20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
27f30 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
27f40 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
27f50 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
27f60 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
27f70 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
27f80 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
27f90 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
27fa0 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
27fb0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
27fc0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
27fd0 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
27fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
27ff0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
28000 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
28010 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
28020 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20  , "%s%c%s",.    
28030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28040 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
28050 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44  rectory, winGetD
28060 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69  irSep(), zRelati
28070 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ve);.  }else{.  
28080 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
28090 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
280a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
280b0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
280c0 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20  elative);.  }.  
280d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
280e0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ;.#endif..#if !S
280f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
28100 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
28110 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
28120 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f  _CYGWIN__).  DWO
28130 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  RD nByte;.  void
28140 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
28150 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f  char *zOut;..  /
28160 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
28170 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
28180 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
28190 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
281a0 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
281b0 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
281c0 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
281d0 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
281e0 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
281f0 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77 69  ve[0]=='/' && wi
28200 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
28210 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76 65  dColon(zRelative
28220 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61  +1) ){.    zRela
28230 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  tive++;.  }..  /
28240 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
28250 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
28260 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
28270 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
28280 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
28290 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
282a0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
282b0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
282c0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
282d0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
282e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
282f0 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
28300 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
28310 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
28320 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
28330 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
28340 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
28350 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
28360 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
28370 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
28380 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
28390 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
283a0 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
283b0 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
283c0 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
283d0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
283e0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
283f0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
28400 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
28410 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
28420 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
28430 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
28440 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
28450 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
28460 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
28470 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
28480 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
28490 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
284a0 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
284b0 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
284c0 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
284d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
284e0 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
284f0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28500 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
28510 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
28520 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28530 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
28540 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
28550 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
28560 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28570 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  K;.  }.  zConver
28580 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
28590 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
285a0 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
285b0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
285c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
285d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
285e0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  M;.  }.  if( osI
285f0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
28600 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
28610 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
28620 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
28630 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
28640 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
28650 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
28660 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28670 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
28680 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
28690 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
286a0 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
286b0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
286c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
286d0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
286e0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
286f0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
28700 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
28710 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
28720 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
28730 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
28740 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
28750 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
28760 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28770 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28790 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
287a0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
287b0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
287c0 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
287d0 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
287e0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
287f0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
28800 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28810 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28820 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28830 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
28840 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
28850 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
28860 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
28870 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
28880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28890 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
288a0 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
288b0 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
288c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
288d0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
288e0 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
288f0 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a  eToUtf8(zTemp);.
28900 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28910 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66  (zTemp);.  }.#if
28920 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
28930 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
28940 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
28950 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
28960 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
28970 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
28980 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
28990 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
289a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
289b0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
289c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
289d0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
289e0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
289f0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
28a00 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
28a30 65 33 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e3", zRelative);
28a40 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
28a50 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
28a60 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
28a70 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
28a80 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
28a90 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
28aa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
28ab0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
28ac0 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
28ad0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
28ae0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
28af0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
28b00 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
28b10 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
28b20 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
28b30 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
28b40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
28b50 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28b60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28b70 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
28b80 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
28b90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
28ba0 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
28bb0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
28bc0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
28be0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20  FullPathname4", 
28bf0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
28c00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
28c10 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
28c20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
28c30 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
28c40 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
28c50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28c60 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
28c70 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
28c80 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
28c90 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
28ca0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
28cb0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
28cc0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
28cd0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
28ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28cf0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
28d00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28d10 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
28d20 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64  .#endif.}..#ifnd
28d30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
28d40 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
28d50 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
28d60 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
28d70 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
28d80 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
28d90 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
28da0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
28db0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
28dc0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
28dd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
28de0 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  winDlOpen(sqlite
28df0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
28e00 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
28e10 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  me){.  HANDLE h;
28e20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
28e30 59 47 57 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e  YGWIN__).  int n
28e40 46 75 6c 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50  Full = pVfs->mxP
28e50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61  athname+1;.  cha
28e60 72 20 2a 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74  r *zFull = sqlit
28e70 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46  e3MallocZero( nF
28e80 75 6c 6c 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a  ull );.  void *z
28e90 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
28ea0 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b   if( zFull==0 ){
28eb0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
28ec0 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
28ed0 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
28ee0 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
28ef0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
28f00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 46  ;.  }.  if( winF
28f10 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
28f20 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75  , zFilename, nFu
28f30 6c 6c 2c 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49  ll, zFull)!=SQLI
28f40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
28f50 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29  ite3_free(zFull)
28f60 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
28f70 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
28f80 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
28f90 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
28fa0 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
28fb0 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  0;.  }.  zConver
28fc0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
28fd0 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
28fe0 28 7a 46 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74  (zFull);.  sqlit
28ff0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a  e3_free(zFull);.
29000 23 65 6c 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43  #else.  void *zC
29010 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
29020 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
29030 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
29040 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
29050 45 54 45 52 28 70 56 66 73 29 3b 0a 23 65 6e 64  ETER(pVfs);.#end
29060 69 66 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  if.  if( zConver
29070 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
29080 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
29090 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
290a0 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
290b0 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
290c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
290d0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
290e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
290f0 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c  INRT.    h = osL
29100 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
29110 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  ry((LPCWSTR)zCon
29120 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73  verted, 0);.#els
29130 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  e.    h = osLoad
29140 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54  LibraryW((LPCWST
29150 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  R)zConverted);.#
29160 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
29170 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
29180 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
29190 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
291a0 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
291b0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
291c0 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
291d0 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
291e0 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
291f0 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
29200 29 68 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )h));.  sqlite3_
29210 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
29220 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
29230 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  *)h;.}.static vo
29240 69 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71  id winDlError(sq
29250 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29260 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
29270 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55  *zBufOut){.  UNU
29280 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
29290 66 73 29 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73  fs);.  winGetLas
292a0 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
292b0 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
292c0 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74  , zBufOut);.}.st
292d0 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44  atic void (*winD
292e0 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
292f0 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c   *pVfs,void *pH,
29300 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
29310 29 29 28 76 6f 69 64 29 7b 0a 20 20 46 41 52 50  ))(void){.  FARP
29320 52 4f 43 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53  ROC proc;.  UNUS
29330 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
29340 73 29 3b 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47  s);.  proc = osG
29350 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28  etProcAddressA((
29360 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29  HANDLE)pH, zSym)
29370 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
29380 53 59 4d 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73  SYM handle=%p, s
29390 79 6d 62 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73  ymbol=%s, addres
293a0 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%p\n",.       
293b0 20 20 20 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a      (void*)pH, z
293c0 53 79 6d 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63  Sym, (void*)proc
293d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  ));.  return (vo
293e0 69 64 28 2a 29 28 76 6f 69 64 29 29 70 72 6f 63  id(*)(void))proc
293f0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
29400 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  winDlClose(sqlit
29410 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
29420 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
29430 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
29440 28 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65  (pVfs);.  osFree
29450 4c 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29  Library((HANDLE)
29460 70 48 61 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52  pHandle);.  OSTR
29470 41 43 45 28 28 22 44 4c 43 4c 4f 53 45 20 68 61  ACE(("DLCLOSE ha
29480 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69  ndle=%p\n", (voi
29490 64 2a 29 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a  d*)pHandle));.}.
294a0 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
294b0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
294c0 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
294d0 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
294e0 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
294f0 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
29500 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
29510 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
29520 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
29530 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
29540 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
29550 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
29560 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
29570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29580 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
29590 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
295a0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
295b0 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
295c0 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
295d0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
295e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
295f0 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
29600 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
29610 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
29620 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
29630 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
29640 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
29650 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
29660 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
29670 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
29680 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
29690 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
296a0 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
296b0 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
296c0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
296d0 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
296e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
296f0 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
29700 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
29710 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
29720 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
29730 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  id);.  }.#if SQL
29740 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
29750 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c  f( sizeof(ULONGL
29760 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ONG)<=nBuf-n ){.
29770 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e      ULONGLONG cn
29780 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
29790 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63  nt64();.    memc
297a0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
297b0 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
297c0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
297d0 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  (cnt);.  }.#else
297e0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
297f0 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
29800 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
29810 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
29820 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
29830 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
29840 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
29850 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
29860 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
29870 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  ( sizeof(LARGE_I
29880 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20  NTEGER)<=nBuf-n 
29890 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54  ){.    LARGE_INT
298a0 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75  EGER i;.    osQu
298b0 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
298c0 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d  unter(&i);.    m
298d0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
298e0 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a  &i, sizeof(i));.
298f0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
29900 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i);.  }.#endif. 
29910 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
29920 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
29930 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
29940 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
29950 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
29960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29970 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
29980 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
29990 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69  icrosec){.  sqli
299a0 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
299b0 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
299c0 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
299d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
299e0 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
299f0 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
29a00 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
29a10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
29a20 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
29a30 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
29a40 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
29a50 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
29a60 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
29a70 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
29a80 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
29a90 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
29aa0 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
29ab0 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
29ac0 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
29ad0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
29ae0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
29af0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
29b00 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
29b10 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
29b20 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
29b30 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
29b40 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
29b50 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
29b60 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
29b70 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
29b80 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
29b90 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
29ba0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
29bb0 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
29bc0 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
29bd0 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
29be0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
29bf0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
29c00 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
29c10 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
29c20 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
29c30 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
29c40 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
29c50 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
29c60 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
29c70 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
29c80 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
29c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29ca0 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
29cb0 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
29cc0 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
29cd0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
29ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29cf0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
29d00 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
29d10 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
29d20 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
29d30 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
29d40 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
29d50 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
29d60 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
29d70 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
29d80 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
29d90 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
29da0 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
29db0 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
29dc0 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
29dd0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
29de0 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
29df0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
29e00 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
29e10 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
29e20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
29e30 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
29e40 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
29e50 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
29e60 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
29e70 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
29e80 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
29e90 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
29ea0 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
29eb0 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
29ec0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29ed0 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
29ee0 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73  alue = .      (s
29ef0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
29f00 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74  0000000 + (sqlit
29f10 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
29f20 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c  000 +.      (sql
29f30 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36  ite3_int64)29496
29f40 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54  7296;..#if SQLIT
29f50 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53  E_OS_WINCE.  SYS
29f60 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20  TEMTIME time;.  
29f70 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
29f80 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20  &time);.  /* if 
29f90 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
29fa0 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74  Time() fails, it
29fb0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a   returns zero. *
29fc0 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65  /.  if (!osSyste
29fd0 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
29fe0 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20  &time,&ft)){.   
29ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2a000 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  RROR;.  }.#else.
2a010 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
2a020 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
2a030 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70   );.#endif..  *p
2a040 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69  iNow = winFileti
2a050 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20  meEpoch +.      
2a060 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65        ((((sqlite
2a070 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67  3_int64)ft.dwHig
2a080 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32  hDateTime)*max32
2a090 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20  BitValue) + .   
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
2a0b0 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
2a0c0 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
2a0d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
2a0e0 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
2a0f0 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
2a100 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2a110 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
2a120 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
2a130 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
2a140 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
2a150 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
2a160 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
2a170 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
2a180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
2a1a0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2a1b0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2a1c0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2a1d0 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
2a1e0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
2a1f0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
2a200 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
2a210 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
2a220 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
2a230 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
2a240 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
2a250 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
2a260 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
2a270 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
2a280 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
2a290 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
2a2a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
2a2b0 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
2a2c0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2a2d0 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
2a2e0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
2a2f0 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
2a300 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
2a310 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2a320 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
2a330 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
2a340 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
2a350 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
2a360 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
2a370 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
2a380 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n Windows (or er
2a390 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
2a3a0 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29  ror_r() on Unix)
2a3b0 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
2a3c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2a3d0 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
2a3e0 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
2a3f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2a400 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
2a410 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
2a420 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
2a430 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
2a440 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
2a450 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
2a460 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
2a470 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
2a480 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
2a490 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
2a4a0 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
2a4b0 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
2a4c0 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
2a4d0 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
2a4e0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
2a4f0 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
2a500 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
2a510 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
2a520 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
2a530 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
2a540 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
2a550 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
2a560 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
2a570 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
2a580 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
2a590 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
2a5a0 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
2a5b0 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
2a5c0 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
2a5d0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
2a5e0 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
2a5f0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
2a600 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
2a610 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
2a620 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
2a630 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
2a640 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
2a650 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2a660 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
2a670 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
2a680 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
2a690 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
2a6a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2a6b0 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
2a6c0 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
2a6d0 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
2a6e0 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
2a6f0 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
2a700 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2a710 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
2a720 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
2a730 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
2a740 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
2a750 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
2a760 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
2a770 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
2a780 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
2a790 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
2a7a0 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
2a7b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
2a7c0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2a7d0 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
2a7e0 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
2a7f0 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
2a800 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
2a810 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
2a820 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
2a830 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
2a840 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2a850 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2a860 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2a870 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2a880 75 72 6e 20 77 69 6e 47 65 74 4c 61 73 74 45 72  urn winGetLastEr
2a890 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
2a8a0 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
2a8b0 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  Buf);.}../*.** I
2a8c0 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65  nitialize and de
2a8d0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  initialize the o
2a8e0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2a8f0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e  interface..*/.in
2a900 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  t sqlite3_os_ini
2a910 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
2a920 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
2a930 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  nVfs = {.    3, 
2a940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a950 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2a960 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2a970 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
2a980 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
2a990 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41  ITE_WIN32_MAX_PA
2a9a0 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
2a9b0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
2a9c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a9d0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2a9e0 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
2a9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
2aa00 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa20 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2aa30 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2aa40 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
2aa50 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
2aa60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2aa70 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2aa80 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2aa90 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2aaa0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2aab0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
2aac0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2aad0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2aae0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2aaf0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
2ab00 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
2ab10 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2ab20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2ab30 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2ab40 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2ab50 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2ab60 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2ab70 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2ab80 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
2ab90 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
2aba0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2abb0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
2abc0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
2abd0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2abe0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2abf0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2ac00 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2ac10 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2ac20 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
2ac30 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2ac40 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
2ac50 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2ac60 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2ac70 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2ac80 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2ac90 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
2aca0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
2acb0 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
2acc0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2acd0 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64    };.#if defined
2ace0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2acf0 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63  S_WIDE).  static
2ad00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2ad10 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a  LongPathVfs = {.
2ad20 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
2ad30 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2ad40 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2ad50 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2ad60 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2ad70 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54      SQLITE_WINNT
2ad80 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2ad90 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2ada0 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2adb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2adc0 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2add0 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20  2-longpath",    
2ade0 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2adf0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2ae00 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2ae10 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae30 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
2ae40 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2ae50 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2ae60 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2ae70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2ae80 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
2ae90 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
2aea0 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2aeb0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2aec0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
2aed0 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2aee0 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2aef0 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2af00 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2af10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2af20 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2af30 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2af40 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2af50 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2af60 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
2af70 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
2af80 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
2af90 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2afa0 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2afb0 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
2afc0 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
2afd0 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
2afe0 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
2aff0 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2b000 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2b010 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
2b020 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2b030 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2b040 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
2b050 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2b060 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2b070 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2b080 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2b090 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2b0a0 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2b0b0 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64  all */.  };.#end
2b0c0 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d  if..  /* Double-
2b0d0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 61  check that the a
2b0e0 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20  Syscall[] array 
2b0f0 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75  has been constru
2b100 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63  cted.  ** correc
2b110 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74  tly.  See ticket
2b120 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65 39   [bb3a86e890c8e9
2b130 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74  6ab] */.  assert
2b140 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  ( ArraySize(aSys
2b150 63 61 6c 6c 29 3d 3d 37 36 20 29 3b 0a 0a 20 20  call)==76 );..  
2b160 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
2b170 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
2b180 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
2b190 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
2b1a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
2b1b0 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53  EM_INFO));.#if S
2b1c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2b1d0 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
2b1e0 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
2b1f0 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47  fo);.#else.  osG
2b200 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
2b210 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69  nSysInfo);.#endi
2b220 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  f.  assert( winS
2b230 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
2b240 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30  ionGranularity>0
2b250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69   );.  assert( wi
2b260 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
2b270 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69  ize>0 );..  sqli
2b280 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2b290 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23  (&winVfs, 1);..#
2b2a0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
2b2b0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2b2c0 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ).  sqlite3_vfs_
2b2d0 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e  register(&winLon
2b2e0 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23 65  gPathVfs, 0);.#e
2b2f0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
2b300 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e  QLITE_OK; .}..in
2b310 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
2b320 28 76 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c  (void){ .#if SQL
2b330 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
2b340 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  f( sleepObj!=NUL
2b350 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  L ){.    osClose
2b360 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29  Handle(sleepObj)
2b370 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d  ;.    sleepObj =
2b380 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69   NULL;.  }.#endi
2b390 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
2b3a0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
2b3b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
2b3c0 20 2a 2f 0a                                       */.