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

Artifact dddffe56dd21fd3687eaec36e01499988918a4fb:


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 0a 23 65 6e 64  ((DWORD)-1).#end
1770: 69 66 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45  if..#ifndef FILE
1780: 5f 46 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66  _FLAG_MASK.# def
1790: 69 6e 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  ine FILE_FLAG_MA
17a0: 53 4b 20 20 20 20 20 20 20 20 20 20 28 30 78 46  SK          (0xF
17b0: 46 33 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a  F3C0000).#endif.
17c0: 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54  .#ifndef FILE_AT
17d0: 54 52 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64  TRIBUTE_MASK.# d
17e0: 65 66 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49  efine FILE_ATTRI
17f0: 42 55 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30  BUTE_MASK     (0
1800: 78 30 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69  x0003FFF7).#endi
1810: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1820: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f  E_OMIT_WAL./* Fo
1830: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1840: 20 74 6f 20 73 74 72 75 63 74 75 72 65 73 20 75   to structures u
1850: 73 65 64 20 66 6f 72 20 57 41 4c 20 2a 2f 0a 74  sed for WAL */.t
1860: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69  ypedef struct wi
1870: 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20 20 20 20  nShm winShm;    
1880: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6e 6e         /* A conn
1890: 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
18a0: 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64  -memory */.typed
18b0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
18c0: 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f 64 65 3b  Node winShmNode;
18d0: 20 20 20 2f 2a 20 41 20 72 65 67 69 6f 6e 20 6f     /* A region o
18e0: 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
18f0: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
1900: 20 57 69 6e 43 45 20 6c 61 63 6b 73 20 6e 61 74   WinCE lacks nat
1910: 69 76 65 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ive support for 
1920: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 6f 20  file locking so 
1930: 77 65 20 68 61 76 65 20 74 6f 20 66 61 6b 65 20  we have to fake 
1940: 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f 6d 65 20  it.** with some 
1950: 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  code of our own.
1960: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
1970: 53 5f 57 49 4e 43 45 0a 74 79 70 65 64 65 66 20  S_WINCE.typedef 
1980: 73 74 72 75 63 74 20 77 69 6e 63 65 4c 6f 63 6b  struct winceLock
1990: 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61 64 65 72   {.  int nReader
19a0: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  s;       /* Numb
19b0: 65 72 20 6f 66 20 72 65 61 64 65 72 20 6c 6f 63  er of reader loc
19c0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20  ks obtained */. 
19d0: 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e 67 3b 20   BOOL bPending; 
19e0: 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65       /* Indicate
19f0: 73 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  s a pending lock
1a00: 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
1a10: 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65  ed */.  BOOL bRe
1a20: 73 65 72 76 65 64 3b 20 20 20 20 20 2f 2a 20 49  served;     /* I
1a30: 6e 64 69 63 61 74 65 73 20 61 20 72 65 73 65 72  ndicates a reser
1a40: 76 65 64 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  ved lock has bee
1a50: 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20  n obtained */.  
1a60: 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69 76 65 3b  BOOL bExclusive;
1a70: 20 20 20 20 2f 2a 20 49 6e 64 69 63 61 74 65 73      /* Indicates
1a80: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1a90: 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61  ck has been obta
1aa0: 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c  ined */.} winceL
1ab0: 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ock;.#endif../*.
1ac0: 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c 65 20 73  ** The winFile s
1ad0: 74 72 75 63 74 75 72 65 20 69 73 20 61 20 73 75  tructure is a su
1ae0: 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65  bclass of sqlite
1af0: 33 5f 66 69 6c 65 2a 20 73 70 65 63 69 66 69 63  3_file* specific
1b00: 20 74 6f 20 74 68 65 20 77 69 6e 33 32 0a 2a 2a   to the win32.**
1b10: 20 70 6f 72 74 61 62 69 6c 69 74 79 20 6c 61 79   portability lay
1b20: 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  er..*/.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 46 69 6c 65 20 77 69  truct winFile wi
1b40: 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 77 69  nFile;.struct wi
1b50: 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20  nFile {.  const 
1b60: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1b70: 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a  ds *pMethod; /**
1b80: 2a 20 4d 75 73 74 20 62 65 20 66 69 72 73 74 20  * Must be first 
1b90: 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ***/.  sqlite3_v
1ba0: 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f  fs *pVfs;      /
1bb0: 2a 20 54 68 65 20 56 46 53 20 75 73 65 64 20 74  * The VFS used t
1bc0: 6f 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  o open this file
1bd0: 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf0: 20 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65   Handle for acce
1c00: 73 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 2a  ssing the file *
1c10: 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79 70 65 3b  /.  u8 locktype;
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c30: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72  ype of lock curr
1c40: 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 20 74 68  ently held on th
1c50: 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 73 68 6f  is file */.  sho
1c60: 72 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  rt sharedLockByt
1c70: 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79  e;   /* Randomly
1c80: 20 63 68 6f 73 65 6e 20 62 79 74 65 20 75 73 65   chosen byte use
1c90: 64 20 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f  d as a shared lo
1ca0: 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74 72 6c 46  ck */.  u8 ctrlF
1cb0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1cc0: 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65 65 20 57  /* Flags.  See W
1cd0: 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a  INFILE_* below *
1ce0: 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
1cf0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  rno;        /* T
1d00: 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
1d10: 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
1d20: 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 6e  /O error */.#ifn
1d30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d40: 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20 2a 70 53  WAL.  winShm *pS
1d50: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  hm;           /*
1d60: 20 49 6e 73 74 61 6e 63 65 20 6f 66 20 73 68 61   Instance of sha
1d70: 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68  red memory on th
1d80: 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69  is file */.#endi
1d90: 66 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  f.  const char *
1da0: 7a 50 61 74 68 3b 20 20 20 20 20 20 2f 2a 20 46  zPath;      /* F
1db0: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
1dc0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
1dd0: 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20  nt szChunk;     
1de0: 20 20 20 20 20 20 20 2f 2a 20 43 68 75 6e 6b 20         /* Chunk 
1df0: 73 69 7a 65 20 63 6f 6e 66 69 67 75 72 65 64 20  size configured 
1e00: 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  by FCNTL_CHUNK_S
1e10: 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  IZE */.#if SQLIT
1e20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4c 50 57  E_OS_WINCE.  LPW
1e30: 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  STR zDeleteOnClo
1e40: 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  se;  /* Name of 
1e50: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 77  file to delete w
1e60: 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20  hen closing */. 
1e70: 20 48 41 4e 44 4c 45 20 68 4d 75 74 65 78 3b 20   HANDLE hMutex; 
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 74 65           /* Mute
1e90: 78 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f  x used to contro
1ea0: 6c 20 61 63 63 65 73 73 20 74 6f 20 73 68 61 72  l access to shar
1eb0: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e  ed lock */.  HAN
1ec0: 44 4c 45 20 68 53 68 61 72 65 64 3b 20 20 20 20  DLE hShared;    
1ed0: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d       /* Shared m
1ee0: 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 75 73  emory segment us
1ef0: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a  ed for locking *
1f00: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f  /.  winceLock lo
1f10: 63 61 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  cal;        /* L
1f20: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 62 79  ocks obtained by
1f30: 20 74 68 69 73 20 69 6e 73 74 61 6e 63 65 20 6f   this instance o
1f40: 66 20 77 69 6e 46 69 6c 65 20 2a 2f 0a 20 20 77  f winFile */.  w
1f50: 69 6e 63 65 4c 6f 63 6b 20 2a 73 68 61 72 65 64  inceLock *shared
1f60: 3b 20 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  ;      /* Global
1f70: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6d 65 6d   shared lock mem
1f80: 6f 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ory for the file
1f90: 20 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20    */.#endif.#if 
1fa0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1fb0: 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65  SIZE>0.  int nFe
1fc0: 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20  tchOut;         
1fd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fe0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
1ff0: 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
2000: 73 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d  s */.  HANDLE hM
2010: 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
2020: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
2030: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 6d 65 6d  or accessing mem
2040: 6f 72 79 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20  ory mapping */. 
2050: 20 76 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f   void *pMapRegio
2060: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2070: 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61  * Area memory ma
2080: 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pped */.  sqlite
2090: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
20a0: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 61 62 6c  ;       /* Usabl
20b0: 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64  e size of mapped
20c0: 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c   region */.  sql
20d0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
20e0: 69 7a 65 41 63 74 75 61 6c 3b 20 2f 2a 20 41 63  izeActual; /* Ac
20f0: 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70  tual size of map
2100: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
2110: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
2120: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 2f 2a  apSizeMax;    /*
2130: 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54   Configured FCNT
2140: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75  L_MMAP_SIZE valu
2150: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
2160: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61  /*.** Allowed va
2170: 6c 75 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65  lues for winFile
2180: 2e 63 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64  .ctrlFlags.*/.#d
2190: 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44  efine WINFILE_RD
21a0: 4f 4e 4c 59 20 20 20 20 20 20 20 20 20 20 30 78  ONLY          0x
21b0: 30 32 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  02   /* Connecti
21c0: 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20  on is read only 
21d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
21e0: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
21f0: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
2200: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
2210: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
2220: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
2230: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
2240: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
2250: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
2260: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
2270: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
2280: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
2290: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
22a0: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
22b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
22c0: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
22d0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
22e0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
22f0: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
2300: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
2310: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
2320: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
2330: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
2340: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
2350: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
2360: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
2370: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
2380: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
2390: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
23a0: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
23b0: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
23c0: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
23d0: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
23e0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
23f0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
2400: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
2410: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
2420: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
2430: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
2440: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
2450: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
2460: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2470: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
2480: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
2490: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
24a0: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
24b0: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
24c0: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
24d0: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
24e0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
24f0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
2500: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
2510: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
2520: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
2530: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
2540: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
2550: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
2560: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
2570: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
2580: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
2590: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
25a0: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
25b0: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
25c0: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
25d0: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
25e0: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
25f0: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
2600: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
2610: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
2620: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
2630: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
2640: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
2650: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
2660: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2670: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
2680: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
2690: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d 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 0a 20 2a 20 57 41  **********. * WA
26f0: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
2700: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
2710: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
2720: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
2730: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
2740: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
2750: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
2760: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
2770: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
2780: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
2790: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
27a0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
27b0: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
27c0: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
27d0: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
27e0: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
27f0: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
2800: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
2810: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
2820: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
2830: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
2840: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
2850: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
2860: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
2870: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
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 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
28d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
28e0: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
28f0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
2900: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
2910: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
2920: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
2930: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
2940: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
2950: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2960: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2970: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2980: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
2990: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
29a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
29b0: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
29c0: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
29d0: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
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 28                 (
2a00: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2a10: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
2a20: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
2a30: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
2a40: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
2a50: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
2a60: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2a70: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
2a80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2a90: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
2aa0: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2ab0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2ac0: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
2ad0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
2ae0: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
2af0: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
2b00: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
2b10: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
2b20: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
2b30: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
2b40: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
2b50: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2b60: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
2b70: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2b80: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
2b90: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0).#endif.../*.*
2ba0: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
2bb0: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
2bc0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
2bd0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
2be0: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
2bf0: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
2c00: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
2c10: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
2c20: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
2c30: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
2c40: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
2c50: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
2c60: 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20    u32 magic1;   
2c70: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
2c80: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
2c90: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
2ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
2cb0: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
2cc0: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
2cd0: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
2ce0: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
2cf0: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
2d00: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
2d10: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
2d20: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
2d30: 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f   u32 magic2;   /
2d40: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
2d50: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
2d60: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
2d70: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66  /.#endif.};..#if
2d80: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
2d90: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
2da0: 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62  1     0x42b2830b
2db0: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f  .#define WINMEM_
2dc0: 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34  MAGIC2     0xbd4
2dd0: 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74  d7cf4.#endif..st
2de0: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
2df0: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
2e00: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
2e10: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
2e20: 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20  MAGIC1,.#endif. 
2e30: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66   NULL, FALSE.#if
2e40: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57  ndef NDEBUG.  ,W
2e50: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e  INMEM_MAGIC2.#en
2e60: 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  dif.};..#ifndef 
2e70: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
2e80: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
2e90: 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  1() assert( win_
2ea0: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d  mem_data.magic1=
2eb0: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
2ec0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
2ed0: 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73  ssertMagic2() as
2ee0: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
2ef0: 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  ta.magic2==WINME
2f00: 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69  M_MAGIC2 ).#defi
2f10: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
2f20: 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73  agic()  winMemAs
2f30: 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69  sertMagic1(); wi
2f40: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32  nMemAssertMagic2
2f50: 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ();.#else.#defin
2f60: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
2f70: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
2f80: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44  efine winMemGetD
2f90: 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d  ataPtr()  &win_m
2fa0: 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20  em_data.#define 
2fb0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
2fc0: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
2fd0: 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77  .hHeap.#define w
2fe0: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
2ff0: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
3000: 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76  bOwned..static v
3010: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
3020: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
3030: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
3040: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
3050: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
3060: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
3070: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
3080: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
3090: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
30a0: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
30b0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
30c0: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
30d0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
30e0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
30f0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
3100: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
3110: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
3120: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
3130: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
3140: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
3150: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
3160: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
3170: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
3180: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
3190: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
31a0: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
31b0: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
31c0: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
31d0: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
31e0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
31f0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
3200: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
3210: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
3220: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
3230: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
3240: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
3250: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
3260: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3270: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
3280: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
3290: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
32a0: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
32b0: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
32c0: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
32d0: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
32e0: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
32f0: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
3300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3310: 45 53 54 0a 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c  EST.LONG volatil
3320: 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  e sqlite3_os_typ
3330: 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61  e = 0;.#else.sta
3340: 74 69 63 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c  tic LONG volatil
3350: 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  e sqlite3_os_typ
3360: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
3370: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
3380: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
3390: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
33a0: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
33b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33c0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
33d0: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
33e0: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
33f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3400: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
3410: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
3420: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
3430: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
3440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
3450: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
3460: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
3470: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
3480: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
3490: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
34a0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
34b0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
34c0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
34d0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
34e0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
34f0: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
3500: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
3510: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
3520: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
3530: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
3540: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
3550: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
3560: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
3570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3590: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
35a0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
35b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
35c0: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
35d0: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
35e0: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
35f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3600: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
3610: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
3620: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
3630: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
3640: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
3650: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
3660: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
3670: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3680: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
3690: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
36a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
36b0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
36c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
36d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
36e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
36f0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
3700: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
3710: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
3720: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
3730: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3740: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
3750: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
3760: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3770: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3780: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3790: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
37a0: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
37b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
37c0: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
37d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
37e0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
37f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3800: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3830: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
3840: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
3850: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
3860: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
3870: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
3880: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3890: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
38a0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
38b0: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
38c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
38d0: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
38e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
38f0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
3900: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3910: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3930: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3940: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
3950: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
3960: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
3970: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
3980: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
3990: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
39a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
39b0: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
39c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
39d0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
39e0: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
39f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
3a00: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3a10: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3a20: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a30: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
3a40: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3a50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3a60: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
3a70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3a80: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
3a90: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
3aa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ac0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ad0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
3ae0: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
3af0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
3b00: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
3b10: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
3b20: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
3b30: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
3b40: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
3b50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
3b70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
3b80: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3b90: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
3ba0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
3bb0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
3bc0: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
3bd0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3be0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3c00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3c20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3c30: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
3c40: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
3c50: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
3c60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
3c70: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
3c80: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
3c90: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
3ca0: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
3cb0: 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f  )..#if (!SQLITE_
3cc0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3cd0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3ce0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
3cf0: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
3d00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
3d10: 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )).  { "CreateFi
3d20: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
3d30: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
3d40: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20  eFileMappingA,  
3d50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3d60: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
3d70: 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  ppingA",      (S
3d80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3db0: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
3dc0: 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44  eMappingA ((HAND
3dd0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
3de0: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
3df0: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
3e00: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
3e10: 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53  DWORD,LPCSTR))aS
3e20: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
3e30: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3e40: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
3e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3e60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3e70: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
3e80: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
3e90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3ea0: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
3eb0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
3ec0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3ed0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
3ee0: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
3ef0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
3f00: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
3f10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3f40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
3f50: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28  teFileMappingW (
3f60: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3f70: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
3f80: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3f90: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
3fa0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53  WORD,DWORD,LPCWS
3fb0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  TR))aSyscall[7].
3fc0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3fd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
3fe0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
3ff0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4000: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  ).  { "CreateMut
4010: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
4020: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
4030: 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20  MutexW,         
4040: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4050: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
4060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4070: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4090: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
40a0: 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65  ine osCreateMute
40b0: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
40c0: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
40d0: 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c  ATTRIBUTES,BOOL,
40e0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53   \.        LPCWS
40f0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
4100: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4110: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4120: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4130: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4150: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
4160: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
4170: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
4180: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
4190: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
41a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
41b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
41d0: 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28  osDeleteFileA ((
41e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
41f0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39  CSTR))aSyscall[9
4200: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4210: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4220: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4230: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
4240: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4250: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
4260: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
4270: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4280: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
4290: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
42a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
42c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
42d0: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20  e osDeleteFileW 
42e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
42f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4300: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
4310: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
4320: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
4330: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4340: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c  e", (SYSCALL)Fil
4350: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4360: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
4370: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4380: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
4390: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
43c0: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
43d0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
43e0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
43f0: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
4400: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
4410: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
4420: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
4430: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
4440: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
4450: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
4460: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65     (SYSCALL)File
4470: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4480: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
4490: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
44a0: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
44b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
44e0: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
44f0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42  ToSystemTime ((B
4500: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
4510: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
4520: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
4530: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
4540: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
4550: 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66  { "FlushFileBuff
4560: 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59  ers",        (SY
4570: 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42  SCALL)FlushFileB
4580: 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30  uffers,        0
4590: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
45a0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20  lushFileBuffers 
45b0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
45c0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
45d0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
45e0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
45f0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4600: 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  I).  { "FormatMe
4610: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
4620: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4630: 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20  tMessageA,      
4640: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4650: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4660: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
4670: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
46a0: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
46b0: 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49  sageA ((DWORD(WI
46c0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
46d0: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
46e0: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
46f0: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
4700: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
4710: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4720: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4730: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4740: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
4750: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4760: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
4770: 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  geW,          0 
4780: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
4790: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
47a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
47b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
47c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
47d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
47e0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20  sFormatMessageW 
47f0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4800: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
4810: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WORD,DWORD,LPWST
4820: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
4830: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
4840: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
4850: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
4860: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
4870: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
4880: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
48a0: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
48b0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
48c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
48d0: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
48e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
48f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4910: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4920: 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28  osFreeLibrary ((
4930: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d  BOOL(WINAPI*)(HM
4940: 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ODULE))aSyscall[
4950: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
4960: 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72   { "GetCurrentPr
4970: 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53  ocessId",     (S
4980: 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e  YSCALL)GetCurren
4990: 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20  tProcessId,     
49a0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
49b0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
49c0: 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41  sId ((DWORD(WINA
49d0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
49e0: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
49f0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4a00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
4a10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4a20: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
4a30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
4a40: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
4a50: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
4a60: 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceA,       0 },.
4a70: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
4a80: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
4a90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4ac0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ad0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20  tDiskFreeSpaceA 
4ae0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4af0: 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  LPCSTR,LPDWORD,L
4b00: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
4b10: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
4b20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  D))aSyscall[18].
4b30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4b40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4b50: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
4b60: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4b70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4b80: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69  WIDE).  { "GetDi
4b90: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
4ba0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4bb0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c  tDiskFreeSpaceW,
4bc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4bd0: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
4be0: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
4bf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4c20: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
4c30: 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f  kFreeSpaceW ((BO
4c40: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
4c50: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
4c60: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
4c70: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
4c80: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
4c90: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4ca0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4cb0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4cc0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4cd0: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
4ce0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4cf0: 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c  utesA,      0 },
4d00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4d10: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
4d20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4d40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4d50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4d60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4d70: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
4d80: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
4d90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
4da0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4db0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4dc0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4dd0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4de0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
4df0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4e00: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
4e10: 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesW,      0 },.
4e20: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
4e30: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
4e40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4e70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4e80: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
4e90: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4ea0: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
4eb0: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
4ec0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4ed0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4ee0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
4ef0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
4f00: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65  ,    (SYSCALL)Ge
4f10: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
4f20: 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  xW,    0 },.#els
4f30: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
4f40: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
4f50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4f80: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
4f90: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28  eAttributesExW (
4fa0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
4fb0: 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45  PCWSTR,GET_FILEE
4fc0: 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c  X_INFO_LEVELS, \
4fd0: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
4fe0: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
4ff0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5000: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5010: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5030: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
5040: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
5050: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5060: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
5070: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5080: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5090: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
50a0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
50b0: 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28  osGetFileSize ((
50c0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
50d0: 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61  ANDLE,LPDWORD))a
50e0: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
50f0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5100: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
5110: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5120: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
5130: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
5140: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
5150: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
5160: 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30  hNameA,        0
5170: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5180: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
5190: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
51a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
51b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
51c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
51d0: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
51e0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
51f0: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
5200: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
5210: 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61    LPSTR*))aSysca
5220: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
5230: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5240: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
5250: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5270: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
5280: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5290: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
52a0: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
52b0: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
52c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
52d0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
52e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
52f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5320: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
5330: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
5340: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
5350: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
5360: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
5370: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
5380: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
5390: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
53a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
53b0: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
53c0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
53d0: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
53e0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
53f0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5400: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
5410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
5420: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
5430: 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51  XTENSION).#if SQ
5440: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5450: 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64  /* The GetProcAd
5460: 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65  dressA() routine
5470: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
5480: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
5490: 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  . */.  { "GetPro
54a0: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
54b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
54c0: 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20  ProcAddressA,   
54d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
54e0: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
54f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
5500: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
5510: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
5520: 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73  e.  ** an ANSI s
5530: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
5540: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
5550: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20   setting */.  { 
5560: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
5570: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
5580: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
5590: 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ss,          0 }
55a0: 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20  ,.#endif.#else. 
55b0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
55c0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
55d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5600: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64  fine osGetProcAd
5610: 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43  dressA ((FARPROC
5620: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
5630: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  E, \.        LPC
5640: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  STR))aSyscall[27
5650: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5660: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5670: 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  T.  { "GetSystem
5680: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
5690: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
56a0: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  temInfo,        
56b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
56c0: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
56d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
56e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5700: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5710: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
5720: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
5730: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
5740: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
5750: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5760: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
5770: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5780: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
5790: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
57a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
57b0: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
57c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
57d0: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
57e0: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
57f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5800: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
5810: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
5820: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
5830: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5840: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
5850: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5860: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
5870: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5890: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
58a0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
58b0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
58c0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
58d0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
58e0: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
58f0: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
5900: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5910: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
5920: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
5930: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
5940: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
5950: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
5960: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5970: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
5980: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5990: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
59c0: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
59d0: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
59e0: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
59f0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
5a00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5a10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
5a20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5a30: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
5a40: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
5a50: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
5a60: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
5a70: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
5a80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5a90: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
5aa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5ab0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5ad0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5ae0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
5af0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
5b00: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
5b10: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
5b20: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5b30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5b40: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
5b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5b60: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
5b70: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
5b80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5b90: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
5ba0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5bb0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5bc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5bd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5be0: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
5bf0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5c00: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
5c10: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
5c20: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5c30: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5c40: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5c50: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
5c60: 49 4f 4e 45 58 29 20 26 26 20 5c 0a 20 20 20 20  IONEX) && \.    
5c70: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
5c80: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
5c90: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
5ca0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5cb0: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
5cc0: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
5cd0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5ce0: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
5cf0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5d00: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5d10: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5d20: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5d30: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
5d40: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5d50: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
5d60: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
5d70: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
5d80: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5d90: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5da0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5db0: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
5dc0: 0a 20 20 20 20 20 20 20 20 64 65 66 69 6e 65 64  .        defined
5dd0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  (SQLITE_WIN32_GE
5de0: 54 56 45 52 53 49 4f 4e 45 58 29 20 26 26 20 53  TVERSIONEX) && S
5df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
5e00: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
5e10: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
5e20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5e30: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
5e40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5e50: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
5e60: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
5e70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5ea0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5eb0: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
5ec0: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
5ed0: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
5ee0: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
5ef0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
5f00: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5f20: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
5f30: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5f40: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5f50: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
5f60: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
5f70: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
5f80: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
5f90: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
5fa0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5fb0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
5fc0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
5fd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5fe0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
5ff0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6000: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6010: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6050: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6060: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
6070: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
6080: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
6090: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
60a0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
60b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
60c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
60d0: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
60e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
60f0: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6100: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6110: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6120: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6130: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6160: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6170: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
6180: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
6190: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
61a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
61b0: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
61c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61d0: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
61e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
61f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6200: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6210: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6220: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6230: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
6240: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
6250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6260: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
6270: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6280: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6290: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
62a0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
62b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
62c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
62d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
62e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
62f0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6300: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6310: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6330: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6340: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
6350: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6360: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6370: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6380: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
6390: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
63a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
63b0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
63c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
63d0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
63e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
63f0: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6400: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6410: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6430: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6440: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
6450: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
6460: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6470: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6480: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
6490: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
64a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
64b0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
64c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
64d0: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
64e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
64f0: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6500: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6510: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6520: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6530: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6560: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6570: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
6580: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6590: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
65a0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
65b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
65c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
65d0: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
65e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
65f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6600: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6610: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6620: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6630: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6640: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6650: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
6660: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6680: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6690: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
66a0: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
66b0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
66c0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
66d0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
66e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
66f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6700: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6710: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6720: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6730: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6740: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6750: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6760: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6770: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
6780: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6790: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
67a0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
67b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
67e0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
67f0: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6800: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6810: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6820: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6830: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6840: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
6850: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6860: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
6870: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
6880: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6890: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
68b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
68d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
68e0: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
68f0: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6900: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6910: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6920: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6930: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6940: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6950: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6960: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6970: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
6980: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6990: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
69a0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
69b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
69c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
69d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
69e0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
69f0: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6a00: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6a10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6a20: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6a30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6a40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6a50: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6a60: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6a70: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6a80: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6a90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6aa0: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6ab0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ac0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6ad0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6ae0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6b10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6b20: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6b30: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6b40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6b50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6b60: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6b70: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6b80: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6b90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6ba0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6bb0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6bc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6bd0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6be0: 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20  _OMIT_WAL)).  { 
6bf0: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  "MapViewOfFile",
6c00: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6c10: 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c  ALL)MapViewOfFil
6c20: 65 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  e,           0 }
6c30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70  ,.#else.  { "Map
6c40: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6c50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6c60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6c70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6c80: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6c90: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28  MapViewOfFile ((
6ca0: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
6cb0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f  HANDLE,DWORD,DWO
6cc0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
6cd0: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6ce0: 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e  call[49].pCurren
6cf0: 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79  t)..  { "MultiBy
6d00: 74 65 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20  teToWideChar",  
6d10: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74     (SYSCALL)Mult
6d20: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c  iByteToWideChar,
6d30: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6d40: 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f  ne osMultiByteTo
6d50: 57 69 64 65 43 68 61 72 20 28 28 69 6e 74 28 57  WideChar ((int(W
6d60: 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f  INAPI*)(UINT,DWO
6d70: 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50  RD,LPCSTR,int,LP
6d80: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
6d90: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30  int))aSyscall[50
6da0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6db0: 20 22 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e   "QueryPerforman
6dc0: 63 65 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53  ceCounter", (SYS
6dd0: 43 41 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72  CALL)QueryPerfor
6de0: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20  manceCounter, 0 
6df0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75  },..#define osQu
6e00: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
6e10: 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e  unter ((BOOL(WIN
6e20: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6e30: 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29   LARGE_INTEGER*)
6e40: 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43  )aSyscall[51].pC
6e50: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65  urrent)..  { "Re
6e60: 61 64 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  adFile",        
6e70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6e80: 29 52 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20  )ReadFile,      
6e90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
6ea0: 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69  #define osReadFi
6eb0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6ec0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44  *)(HANDLE,LPVOID
6ed0: 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  ,DWORD,LPDWORD, 
6ee0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52  \.        LPOVER
6ef0: 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c  LAPPED))aSyscall
6f00: 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [52].pCurrent)..
6f10: 20 20 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c    { "SetEndOfFil
6f20: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
6f30: 53 59 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66  SYSCALL)SetEndOf
6f40: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
6f50: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6f60: 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28  sSetEndOfFile ((
6f70: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f80: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
6f90: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
6fa0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6fb0: 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50  RT.  { "SetFileP
6fc0: 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  ointer",        
6fd0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69    (SYSCALL)SetFi
6fe0: 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20  lePointer,      
6ff0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7000: 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74   { "SetFilePoint
7010: 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  er",          (S
7020: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7040: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7050: 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f  fine osSetFilePo
7060: 69 6e 74 65 72 20 28 28 44 57 4f 52 44 28 57 49  inter ((DWORD(WI
7070: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f  NAPI*)(HANDLE,LO
7080: 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20  NG,PLONG, \.    
7090: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
70a0: 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74  all[54].pCurrent
70b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
70c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65  S_WINRT.  { "Sle
70d0: 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
70e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
70f0: 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
7100: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7110: 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c  lse.  { "Sleep",
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7160: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65  ..#define osSlee
7170: 70 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  p ((VOID(WINAPI*
7180: 29 28 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  )(DWORD))aSyscal
7190: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
71a0: 0a 20 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65  .  { "SystemTime
71b0: 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20  ToFileTime",    
71c0: 28 53 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54  (SYSCALL)SystemT
71d0: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20  imeToFileTime,  
71e0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
71f0: 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
7200: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
7210: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53  NAPI*)(CONST SYS
7220: 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20  TEMTIME*, \.    
7230: 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29      LPFILETIME))
7240: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
7250: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7260: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
7270: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7280: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7290: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
72a0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
72b0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
72c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
72d0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20   "UnlockFile",  
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
72f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7310: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
7320: 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a  ef osUnlockFile.
7330: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b  #define osUnlock
7340: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
7350: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7360: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7370: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7380: 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75  aSyscall[57].pCu
7390: 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23  rrent).#endif..#
73a0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
73b0: 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NCE.  { "UnlockF
73c0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
73d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
73e0: 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20  ckFileEx,       
73f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7400: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45    { "UnlockFileE
7410: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  x",            (
7420: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7450: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
7460: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
7470: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7480: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
7490: 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c  .        LPOVERL
74a0: 41 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b  APPED))aSyscall[
74b0: 35 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  58].pCurrent)..#
74c0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
74d0: 43 45 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  CE || !defined(S
74e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
74f0: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7500: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7510: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7520: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7530: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7540: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
7550: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
7560: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7580: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7590: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
75a0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
75b0: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
75c0: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
75d0: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
75e0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
75f0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7600: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7610: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7620: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7630: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
7640: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
7650: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
7660: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
7670: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
7680: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
7690: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
76a0: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
76b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
76c0: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
76e0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
76f0: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7700: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7710: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7720: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7730: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7740: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
7750: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7760: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7770: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7780: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7790: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
77a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
77b0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
77c0: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
77d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7800: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7810: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7820: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7830: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
7840: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
7850: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
7860: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
7870: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7880: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7890: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
78a0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
78b0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
78c0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
78d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
78e0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
78f0: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7900: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7920: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7930: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7940: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
7950: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7960: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7970: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
7980: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7990: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
79a0: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
79b0: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
79c0: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
79d0: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20  ngleObjectEx,   
79e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
79f0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
7a00: 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43 41  ectEx",   (SYSCA
7a10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7a30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7a40: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
7a50: 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44  ObjectEx ((DWORD
7a60: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7a70: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7a80: 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c    BOOL))aSyscall
7a90: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
7aa0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
7ab0: 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  NRT.  { "SetFile
7ac0: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7ad0: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46     (SYSCALL)SetF
7ae0: 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20  ilePointerEx,   
7af0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7b00: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7b10: 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20 28  terEx",        (
7b20: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7b50: 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50  efine osSetFileP
7b60: 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28  ointerEx ((BOOL(
7b70: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7b80: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c  LARGE_INTEGER, \
7b90: 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f  .        PLARGE_
7ba0: 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61  INTEGER,DWORD))a
7bb0: 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72  Syscall[65].pCur
7bc0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7bd0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7be0: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
7bf0: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28  onByHandleEx", (
7c00: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49  SYSCALL)GetFileI
7c10: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
7c20: 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  leEx, 0 },.#else
7c30: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
7c40: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
7c50: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  Ex", (SYSCALL)0,
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7c80: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
7c90: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
7ca0: 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  dleEx ((BOOL(WIN
7cb0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a  API*)(HANDLE, \.
7cc0: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46          FILE_INF
7cd0: 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53  O_BY_HANDLE_CLAS
7ce0: 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29  S,LPVOID,DWORD))
7cf0: 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75  aSyscall[66].pCu
7d00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7d10: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
7d20: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7d30: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61  MIT_WAL).  { "Ma
7d40: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
7d50: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
7d60: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  )MapViewOfFileFr
7d70: 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23  omApp,    0 },.#
7d80: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
7d90: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
7da0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7dd0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
7de0: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
7df0: 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  p ((LPVOID(WINAP
7e00: 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47  I*)(HANDLE,ULONG
7e10: 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20  ,ULONG64, \.    
7e20: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
7e30: 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e  call[67].pCurren
7e40: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7e50: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
7e60: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
7e70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7e80: 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20  CreateFile2,    
7e90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7ea0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
7eb0: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
7ec0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7ef0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
7f00: 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45  teFile2 ((HANDLE
7f10: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
7f20: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  R,DWORD,DWORD,DW
7f30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7f40: 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  PCREATEFILE2_EXT
7f50: 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
7f60: 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70  ))aSyscall[68].p
7f70: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
7f80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
7f90: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7fa0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
7fb0: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50  SION).  { "LoadP
7fc0: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
7fd0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
7fe0: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
7ff0: 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  y,     0 },.#els
8000: 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  e.  { "LoadPacka
8010: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
8020: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8040: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8050: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61  #define osLoadPa
8060: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28  ckagedLibrary ((
8070: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
8080: 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  (LPCWSTR, \.    
8090: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
80a0: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
80b0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
80c0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
80d0: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
80e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
80f0: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20  etTickCount64,  
8100: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8110: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
8120: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
8130: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8150: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8160: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
8170: 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e  ckCount64 ((ULON
8180: 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56  GLONG(WINAPI*)(V
8190: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  OID))aSyscall[70
81a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
81b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
81c0: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
81d0: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
81e0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69  (SYSCALL)GetNati
81f0: 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  veSystemInfo,   
8200: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8210: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
8220: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
8230: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8250: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8260: 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79  ne osGetNativeSy
8270: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
8280: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
8290: 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46      LPSYSTEM_INF
82a0: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e  O))aSyscall[71].
82b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
82c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
82d0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
82e0: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
82f0: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
8300: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
8310: 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30  gStringA,      0
8320: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
8330: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8340: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
8350: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8360: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8370: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8380: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
8390: 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41  ingA ((VOID(WINA
83a0: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
83b0: 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65  scall[72].pCurre
83c0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
83d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
83e0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74  S_WIDE).  { "Out
83f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
8400: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8410: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8420: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
8430: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
8440: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
8450: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8480: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
8490: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28  utDebugStringW (
84a0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
84b0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
84c0: 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [73].pCurrent)..
84d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48    { "GetProcessH
84e0: 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28  eap",          (
84f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65  SYSCALL)GetProce
8500: 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20  ssHeap,         
8510: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
8520: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20  sGetProcessHeap 
8530: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
8540: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
8550: 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [74].pCurrent)..
8560: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8570: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
8580: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
8590: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
85a0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c  MappingFromApp",
85b0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
85c0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
85d0: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  pp, 0 },.#else. 
85e0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
85f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
8600: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8620: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8630: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
8640: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20  eMappingFromApp 
8650: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
8660: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
8670: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
8680: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c  TTRIBUTES,ULONG,
8690: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29  ULONG64,LPCWSTR)
86a0: 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43  )aSyscall[75].pC
86b0: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e  urrent)../*.** N
86c0: 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62  OTE: On some sub
86d0: 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65 20  -platforms, the 
86e0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
86f0: 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e 63  reExchange "func
8700: 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69  tion".**       i
8710: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
8720: 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73 20  macro that uses 
8730: 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69  a compiler intri
8740: 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29 2e  nsic (e.g. x64).
8750: 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
8760: 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  (InterlockedComp
8770: 61 72 65 45 78 63 68 61 6e 67 65 29 0a 23 64 65  areExchange).#de
8780: 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b  fine osInterlock
8790: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
87a0: 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  e InterlockedCom
87b0: 70 61 72 65 45 78 63 68 61 6e 67 65 0a 23 65 6c  pareExchange.#el
87c0: 73 65 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63  se.  { "Interloc
87d0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
87e0: 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 49 6e  ge", (SYSCALL)In
87f0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8800: 45 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c 0a 0a  Exchange, 0 },..
8810: 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c  #define osInterl
8820: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
8830: 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49 4e 41  ange ((LONG(WINA
8840: 50 49 2a 29 28 4c 4f 4e 47 20 76 6f 6c 61 74 69  PI*)(LONG volati
8850: 6c 65 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  le*, \.        L
8860: 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63 61  ONG,LONG))aSysca
8870: 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[76].pCurrent)
8880: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
8890: 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  ed(InterlockedCo
88a0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 20 2a  mpareExchange) *
88b0: 2f 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20  /..}; /* End of 
88c0: 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65  the overrideable
88d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f   system calls */
88e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
88f0: 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61  the xSetSystemCa
8900: 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73  ll() method of s
8910: 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61  qlite3_vfs for a
8920: 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69  ll of the.** "wi
8930: 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74  n32" VFSes.  Ret
8940: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70  urn SQLITE_OK op
8950: 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  on successfully 
8960: 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20  updating the.** 
8970: 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e  system call poin
8980: 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ter, or SQLITE_N
8990: 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65  OTFOUND if there
89a0: 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61   is no configura
89b0: 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  ble.** system ca
89c0: 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a  ll named zName..
89d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
89e0: 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nSetSystemCall(.
89f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
8a00: 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20  NotUsed,        
8a10: 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74  /* The VFS point
8a20: 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f  er.  Not used */
8a30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8a40: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8a50: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74   /* Name of syst
8a60: 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72  em call to overr
8a70: 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ide */.  sqlite3
8a80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65  _syscall_ptr pNe
8a90: 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65  wFunc  /* Pointe
8aa0: 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20  r to new system 
8ab0: 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b  call value */.){
8ac0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
8ad0: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
8ae0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a  LITE_NOTFOUND;..
8af0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8b00: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
8b10: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
8b20: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61      /* If no zNa
8b30: 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73  me is given, res
8b40: 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20  tore all system 
8b50: 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64  calls to their d
8b60: 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  efault.    ** se
8b70: 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  ttings and retur
8b80: 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20  n NULL.    */.  
8b90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
8ba0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8bb0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
8bc0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
8bd0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
8be0: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
8bf0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20  i].pDefault ){. 
8c00: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
8c10: 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53  i].pCurrent = aS
8c20: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8c30: 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  lt;.      }.    
8c40: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
8c50: 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70  * If zName is sp
8c60: 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65  ecified, operate
8c70: 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65   on only the one
8c80: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20   system call.   
8c90: 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20   ** specified.. 
8ca0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
8cb0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
8cc0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
8cd0: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
8ce0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
8cf0: 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c  p(zName, aSyscal
8d00: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8d10: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53  {.        if( aS
8d20: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
8d30: 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  lt==0 ){.       
8d40: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
8d50: 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61  Default = aSysca
8d60: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
8d70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
8d90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
8da0: 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77  ewFunc==0 ) pNew
8db0: 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b  Func = aSyscall[
8dc0: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
8dd0: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
8de0: 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77  .pCurrent = pNew
8df0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72  Func;.        br
8e00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8e10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8e20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
8e30: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
8e40: 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20   a system call. 
8e50: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
8e60: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a  zName is not a.*
8e70: 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73  * recognized sys
8e80: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20  tem call name.  
8e90: 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74  NULL is also ret
8ea0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73  urned if the sys
8eb0: 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63  tem call.** is c
8ec0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e  urrently undefin
8ed0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ed..*/.static sq
8ee0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
8ef0: 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61  r winGetSystemCa
8f00: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
8f10: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63  s *pNotUsed,.  c
8f20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
8f30: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  .){.  unsigned i
8f40: 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  nt i;..  UNUSED_
8f50: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
8f60: 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ed);.  for(i=0; 
8f70: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
8f80: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
8f90: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
8fa0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
8fb0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
8fc0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
8fd0: 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  rn aSyscall[i].p
8fe0: 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72  Current;.  }.  r
8ff0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9000: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
9010: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73  e of the first s
9020: 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72  ystem call after
9030: 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d   zName.  If zNam
9040: 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  e==NULL.** then 
9050: 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  return the name 
9060: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
9070: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
9080: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a  n NULL if zName.
9090: 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73  ** is the last s
90a0: 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66  ystem call or if
90b0: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68   zName is not th
90c0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
90d0: 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  d.** system call
90e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
90f0: 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53  t char *winNextS
9100: 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65  ystemCall(sqlite
9110: 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20  3_vfs *p, const 
9120: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
9130: 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55  int i = -1;..  U
9140: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9150: 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  p);.  if( zName 
9160: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
9170: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
9180: 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  call)-1; i++){. 
9190: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
91a0: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
91b0: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
91c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
91d0: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72    for(i++; i<Arr
91e0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
91f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
9200: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
9210: 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e  rent!=0 ) return
9220: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
9230: 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  me;.  }.  return
9240: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
9250: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
9260: 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  C./*.** If a Win
9270: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
9280: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
9290: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
92a0: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
92b0: 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74 2e  o.** compact it.
92c0: 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c 20    Upon success, 
92d0: 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20 62  SQLITE_OK will b
92e0: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55 70 6f  e returned.  Upo
92f0: 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a  n failure, one.*
9300: 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * of SQLITE_NOME
9310: 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  M, SQLITE_ERROR,
9320: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
9330: 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65 74 75  UND will be retu
9340: 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22 70  rned.  The.** "p
9350: 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75 6d 65  nLargest" argume
9360: 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c  nt, if non-zero,
9370: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
9380: 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   return the size
9390: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67 65   of the.** large
93a0: 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66 72 65  st committed fre
93b0: 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20 68  e block in the h
93c0: 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  eap, in bytes..*
93d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
93e0: 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61 70  n32_compact_heap
93f0: 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67 65 73  (LPUINT pnLarges
9400: 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
9410: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54  QLITE_OK;.  UINT
9420: 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 20   nLargest = 0;. 
9430: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
9440: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
9450: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
9460: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
9470: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
9480: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
9490: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
94a0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
94b0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
94c0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
94d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
94e0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
94f0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
9500: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
9510: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9520: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
9530: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
9540: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
9550: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9560: 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73 74  .  if( (nLargest
9570: 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28 68  =osHeapCompact(h
9580: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9590: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29 3d  32_HEAP_FLAGS))=
95a0: 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  =0 ){.    DWORD 
95b0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
95c0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
95d0: 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
95e0: 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20  =NO_ERROR ){.   
95f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
9600: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
9610: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70  iled to HeapComp
9620: 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c 20  act (no space), 
9630: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
9640: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
9650: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
9660: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9670: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
9680: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
9690: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22  (SQLITE_ERROR, "
96a0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
96b0: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61  mpact (%lu), hea
96c0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
96d0: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
96e0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
96f0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  *)hHeap);.      
9700: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
9710: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
9720: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  se.  sqlite3_log
9730: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  (SQLITE_NOTFOUND
9740: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
9750: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25  pCompact, heap=%
9760: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9770: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
9780: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
9790: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a  OTFOUND;.#endif.
97a0: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20    if( pnLargest 
97b0: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e  ) *pnLargest = n
97c0: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72  Largest;.  retur
97d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
97e0: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
97f0: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
9800: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
9810: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
9820: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74  tempt to.** dest
9830: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
9840: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e   it.  If the Win
9850: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69  32 native heap i
9860: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61  s not isolated a
9870: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c  nd/or.** the sql
9880: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
9890: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  () function does
98a0: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f   not return zero
98b0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69  , SQLITE_BUSY wi
98c0: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65  ll.** be returne
98d0: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73  d and no changes
98e0: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
98f0: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   the Win32 nativ
9900: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73  e heap..*/.int s
9910: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73  qlite3_win32_res
9920: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74  et_heap(){.  int
9930: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47   rc;.  MUTEX_LOG
9940: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
9950: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a  x *pMaster; ) /*
9960: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
9970: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
9980: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
9990: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20  _mutex *pMem; ) 
99a0: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73     /* The memsys
99b0: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
99c0: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
99d0: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
99e0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
99f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
9a00: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54  MASTER); ).  MUT
9a10: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d  EX_LOGIC( pMem =
9a20: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
9a30: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
9a40: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20  STATIC_MEM); ). 
9a50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9a60: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
9a70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9a80: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69  nter(pMem);.  wi
9a90: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
9aa0: 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47  );.  if( winMemG
9ab0: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26  etHeap()!=NULL &
9ac0: 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  & winMemGetOwned
9ad0: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65  () && sqlite3_me
9ae0: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
9af0: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9b00: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
9b10: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
9b20: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65  o outstanding me
9b30: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
9b40: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68   on.    ** the h
9b50: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63  eap.  Also, sinc
9b60: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65  e both the maste
9b70: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63  r and memsys loc
9b80: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ks are currently
9b90: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65  .    ** being he
9ba0: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68  ld by us, no oth
9bb0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  er function (i.e
9bc0: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  . from another t
9bd0: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20  hread) should.  
9be0: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20    ** be able to 
9bf0: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20  even access the 
9c00: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74  heap.  Attempt t
9c10: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  o destroy and re
9c20: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a  create our.    *
9c30: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32  * isolated Win32
9c40: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77   native heap now
9c50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
9c60: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
9c70: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
9c80: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
9c90: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
9ca0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9cb0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
9cc0: 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d  =0 );.    winMem
9cd0: 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47  Shutdown(winMemG
9ce0: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
9cf0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
9d00: 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20  GetHeap()==NULL 
9d10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
9d20: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
9d30: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9d40: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
9d50: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
9d60: 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28  rc = winMemInit(
9d70: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
9d80: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
9d90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
9da0: 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  | winMemGetHeap(
9db0: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
9dc0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
9dd0: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
9de0: 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20  tOwned() );.    
9df0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9e00: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
9e10: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
9e20: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
9e30: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
9e40: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9e50: 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  p cannot be modi
9e60: 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20  fied because it 
9e70: 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20  may be in use.. 
9e80: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
9e90: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
9ea0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9eb0: 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73  leave(pMem);.  s
9ec0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9ed0: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
9ee0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
9ef0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
9f00: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
9f10: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
9f20: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70  n outputs the sp
9f30: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73  ecified (ANSI) s
9f40: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e  tring to the Win
9f50: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28  32 debugger.** (
9f60: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
9f70: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  /..void sqlite3_
9f80: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
9f90: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  g(const char *zB
9fa0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
9fb0: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51   char zDbgBuf[SQ
9fc0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
9fd0: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  UF_SIZE];.  int 
9fe0: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c  nMin = MIN(nBuf,
9ff0: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44   (SQLITE_WIN32_D
a000: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29  BG_BUF_SIZE - 1)
a010: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67  ); /* may be neg
a020: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20  ative. */.  if( 
a030: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d  nMin<-1 ) nMin =
a040: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61   -1; /* all nega
a050: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f  tive values beco
a060: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65  me -1. */.  asse
a070: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20  rt( nMin==-1 || 
a080: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c  nMin==0 || nMin<
a090: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a0a0: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66  _BUF_SIZE );.#if
a0b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a0c0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
a0d0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
a0e0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
a0f0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a100: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a110: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
a120: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
a130: 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  n);.    osOutput
a140: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62  DebugStringA(zDb
a150: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
a160: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
a170: 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a  gStringA(zBuf);.
a180: 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65    }.#elif define
a190: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a1a0: 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65  AS_WIDE).  memse
a1b0: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
a1c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a1d0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28  UF_SIZE);.  if (
a1e0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
a1f0: 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20  deChar(.        
a200: 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41    osAreFileApisA
a210: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
a220: 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42   CP_OEMCP, 0, zB
a230: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d  uf,.          nM
a240: 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67  in, (LPWSTR)zDbg
a250: 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  Buf, SQLITE_WIN3
a260: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73  2_DBG_BUF_SIZE/s
a270: 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30  izeof(WCHAR))<=0
a280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
a290: 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65    }.  osOutputDe
a2a0: 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57  bugStringW((LPCW
a2b0: 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65  STR)zDbgBuf);.#e
a2c0: 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  lse.  if( nMin>0
a2d0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
a2e0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
a2f0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a300: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
a310: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
a320: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69   nMin);.    fpri
a330: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
a340: 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  , zDbgBuf);.  }e
a350: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
a360: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
a370: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Buf);.  }.#endif
a380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
a390: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
a3a0: 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72  suspends the cur
a3b0: 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20  rent thread for 
a3c0: 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d  at least ms.** m
a3d0: 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68  illiseconds.  Th
a3e0: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
a3f0: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c   to the Win32 Sl
a400: 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e  eep() interface.
a410: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
a420: 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48  S_WINRT.static H
a430: 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d  ANDLE sleepObj =
a440: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76   NULL;.#endif..v
a450: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
a460: 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69  2_sleep(DWORD mi
a470: 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  lliseconds){.#if
a480: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
a490: 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a  .  if ( sleepObj
a4a0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c  ==NULL ){.    sl
a4b0: 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74  eepObj = osCreat
a4c0: 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20  eEventExW(NULL, 
a4d0: 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45  NULL, CREATE_EVE
a4e0: 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c  NT_MANUAL_RESET,
a4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20   SYNCHRONIZE);. 
a520: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65   }.  assert( sle
a530: 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20  epObj!=NULL );. 
a540: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
a550: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
a560: 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  j, milliseconds,
a570: 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20   FALSE);.#else. 
a580: 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65   osSleep(millise
a590: 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  conds);.#endif.}
a5a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a5b0: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
a5c0: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
a5d0: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
a5e0: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
a5f0: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
a600: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
a610: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
a620: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
a630: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
a640: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
a650: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
a660: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
a670: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
a680: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
a690: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
a6a0: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
a6b0: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
a6c0: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
a6d0: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
a6e0: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
a6f0: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
a700: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
a710: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
a720: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
a730: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
a740: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
a750: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
a760: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
a770: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
a780: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
a790: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
a7a0: 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 64 65 66  PI..*/..#if !def
a7b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a7c0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 29 20  2_GETVERSIONEX) 
a7d0: 7c 7c 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32  || !SQLITE_WIN32
a7e0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
a7f0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
a800: 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54   (1).#elif SQLIT
a810: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
a820: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c  LITE_OS_WINRT ||
a830: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a840: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
a850: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
a860: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
a870: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
a880: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
a890: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
a8a0: 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66   (0).#else.# def
a8b0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28  ine osIsNT()  ((
a8c0: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
a8d0: 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77  =2) || sqlite3_w
a8e0: 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65  in32_is_nt()).#e
a8f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
a900: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
a910: 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63 68  ines if the mach
a920: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ine is running a
a930: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64   version of Wind
a940: 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ows.** based on 
a950: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a  the NT kernel..*
a960: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
a970: 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b  n32_is_nt(void){
a980: 0a 20 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f  .  if( osInterlo
a990: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
a9a0: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
a9b0: 74 79 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29  type, 0, 0)==0 )
a9c0: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 54  {.#if defined(NT
a9d0: 44 44 49 5f 56 45 52 53 49 4f 4e 29 20 26 26 20  DDI_VERSION) && 
a9e0: 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 20 3e 3d  NTDDI_VERSION >=
a9f0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 20 20 20 20   NTDDI_WIN8.    
aa00: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73  OSVERSIONINFOW s
aa10: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
aa20: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
aa30: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
aa40: 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65  fo);.    osGetVe
aa50: 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29  rsionExW(&sInfo)
aa60: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4f 53 56 45  ;.#else.    OSVE
aa70: 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f  RSIONINFOA sInfo
aa80: 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53  ;.    sInfo.dwOS
aa90: 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20  VersionInfoSize 
aaa0: 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b  = sizeof(sInfo);
aab0: 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f  .    osGetVersio
aac0: 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 23 65  nExA(&sInfo);.#e
aad0: 6e 64 69 66 0a 20 20 20 20 6f 73 49 6e 74 65 72  ndif.    osInter
aae0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
aaf0: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
ab00: 73 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  s_type,.        
ab10: 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72  (sInfo.dwPlatfor
ab20: 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46  mId == VER_PLATF
ab30: 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20  ORM_WIN32_NT) ? 
ab40: 32 20 3a 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20  2 : 1, 0);.  }. 
ab50: 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c   return osInterl
ab60: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
ab70: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
ab80: 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b  _type, 2, 2)==2;
ab90: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
aba0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f  E_WIN32_MALLOC./
abb0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
abc0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a  ytes of memory..
abd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
abe0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
abf0: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
ac00: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
ac10: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
ac20: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
ac30: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
ac40: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
ac50: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
ac60: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
ac70: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
ac80: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
ac90: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
aca0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
acb0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
acc0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f  ATE).  assert( o
acd0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
ace0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
acf0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55  2_HEAP_FLAGS, NU
ad00: 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  LL) );.#endif.  
ad10: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
ad20: 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61  0 );.  p = osHea
ad30: 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51  pAlloc(hHeap, SQ
ad40: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
ad50: 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e  FLAGS, (SIZE_T)n
ad60: 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70  Bytes);.  if( !p
ad70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ad80: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
ad90: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
ada0: 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20  pAlloc %u bytes 
adb0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
adc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
add0: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
ade0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
adf0: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
ae00: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
ae10: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a  ** Free memory..
ae20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ae30: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
ae40: 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c  pPrior){.  HANDL
ae50: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
ae60: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
ae70: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
ae80: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
ae90: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
aea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
aeb0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
aec0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
aed0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
aee0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
aef0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
af00: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
af10: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
af20: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
af30: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
af40: 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e  , pPrior) );.#en
af50: 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f  dif.  if( !pPrio
af60: 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50  r ) return; /* P
af70: 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48  assing NULL to H
af80: 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66  eapFree is undef
af90: 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21  ined. */.  if( !
afa0: 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70  osHeapFree(hHeap
afb0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
afc0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
afd0: 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  r) ){.    sqlite
afe0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
aff0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
b000: 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70  eapFree block %p
b010: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
b020: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b030: 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c    pPrior, osGetL
b040: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
b050: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d  d*)hHeap);.  }.}
b060: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
b070: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
b080: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
b090: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
b0a0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
b0b0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
b0c0: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
b0d0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
b0e0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
b0f0: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
b100: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
b110: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
b120: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b130: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b140: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
b150: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
b160: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
b170: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
b180: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
b190: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
b1a0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
b1b0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
b1c0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
b1d0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b  LAGS, pPrior) );
b1e0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
b1f0: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
b200: 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a   if( !pPrior ){.
b210: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c      p = osHeapAl
b220: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
b230: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b240: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
b250: 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  es);.  }else{.  
b260: 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c    p = osHeapReAl
b270: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
b280: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b290: 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a  GS, pPrior, (SIZ
b2a0: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
b2b0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
b2c0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
b2d0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
b2e0: 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65  ed to %s %u byte
b2f0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
b300: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
b310: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
b320: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
b330: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
b340: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
b350: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
b360: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
b370: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b380: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
b390: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
b3a0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
b3b0: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
b3c0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
b3d0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
b3e0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
b3f0: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
b400: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
b410: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
b420: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
b430: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
b440: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
b450: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
b460: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
b470: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
b480: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
b490: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b4a0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
b4b0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
b4c0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
b4d0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
b4e0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b  EAP_FLAGS, p) );
b4f0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
b500: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
b510: 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48   = osHeapSize(hH
b520: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
b530: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
b540: 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45  ;.  if( n==(SIZE
b550: 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c  _T)-1 ){.    sql
b560: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b570: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
b580: 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b  o HeapSize block
b590: 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d   %p (%lu), heap=
b5a0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
b5b0: 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73       p, osGetLas
b5c0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
b5d0: 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74  )hHeap);.    ret
b5e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
b5f0: 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f  urn (int)n;.}../
b600: 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20  *.** Round up a 
b610: 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20  request size to 
b620: 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61  the next valid a
b630: 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a  llocation size..
b640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
b650: 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20  nMemRoundup(int 
b660: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  n){.  return n;.
b670: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b680: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
b690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b6a0: 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a  inMemInit(void *
b6b0: 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e  pAppData){.  win
b6c0: 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d  MemData *pWinMem
b6d0: 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61  Data = (winMemDa
b6e0: 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a  ta *)pAppData;..
b6f0: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
b700: 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ta ) return SQLI
b710: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65  TE_ERROR;.  asse
b720: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
b730: 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f  >magic1==WINMEM_
b740: 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65  MAGIC1 );.  asse
b750: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
b760: 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f  >magic2==WINMEM_
b770: 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21  MAGIC2 );..#if !
b780: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
b790: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
b7a0: 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66  HEAP_CREATE.  if
b7b0: 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  ( !pWinMemData->
b7c0: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f  hHeap ){.    DWO
b7d0: 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65  RD dwInitialSize
b7e0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
b7f0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a  HEAP_INIT_SIZE;.
b800: 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69      DWORD dwMaxi
b810: 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44  mumSize = (DWORD
b820: 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  )sqlite3GlobalCo
b830: 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20  nfig.nHeap;.    
b840: 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  if( dwMaximumSiz
b850: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77  e==0 ){.      dw
b860: 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51  MaximumSize = SQ
b870: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
b880: 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65  MAX_SIZE;.    }e
b890: 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74 69 61  lse if( dwInitia
b8a0: 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53  lSize>dwMaximumS
b8b0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49  ize ){.      dwI
b8c0: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d  nitialSize = dwM
b8d0: 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20  aximumSize;.    
b8e0: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
b8f0: 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61  a->hHeap = osHea
b900: 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57  pCreate(SQLITE_W
b910: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
b920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c         dwInitial
b950: 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53  Size, dwMaximumS
b960: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
b970: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
b980: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
b990: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
b9a0: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22  MEM,.          "
b9b0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72  failed to HeapCr
b9c0: 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67  eate (%lu), flag
b9d0: 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25  s=%u, initSize=%
b9e0: 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22  lu, maxSize=%lu"
b9f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  ,.          osGe
ba00: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51  tLastError(), SQ
ba10: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
ba20: 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c  FLAGS, dwInitial
ba30: 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
ba40: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
ba50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ba60: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
ba70: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
ba80: 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b  ->bOwned = TRUE;
ba90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
baa0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
bab0: 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
bac0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bad0: 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73  ap = osGetProces
bae0: 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21  sHeap();.  if( !
baf0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bb00: 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ap ){.    sqlite
bb10: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
bb20: 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69  EM,.        "fai
bb30: 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73  led to GetProces
bb40: 73 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73  sHeap (%lu)", os
bb50: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  GetLastError());
bb60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bb70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
bb80: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
bb90: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61  ned = FALSE;.  a
bba0: 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44  ssert( !pWinMemD
bbb0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23  ata->bOwned );.#
bbc0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
bbd0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
bbe0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
bbf0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
bc00: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
bc10: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
bc20: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
bc30: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
bc40: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
bc50: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
bc60: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
bc70: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
bc80: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
bc90: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
bca0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
bcb0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
bcc0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
bcd0: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  Deinitialize thi
bce0: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
bcf0: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
bd00: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
bd10: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
bd20: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
bd30: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
bd40: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
bd50: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
bd60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
bd70: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
bd80: 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  ->magic1==WINMEM
bd90: 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73  _MAGIC1 );.  ass
bda0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
bdb0: 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  ->magic2==WINMEM
bdc0: 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20 69 66  _MAGIC2 );..  if
bdd0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
bde0: 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  Heap ){.    asse
bdf0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
be00: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
be10: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
be20: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
be30: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
be40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
be50: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
be60: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
be70: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
be80: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
be90: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bea0: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
beb0: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57  endif.    if( pW
bec0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
bed0: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  d ){.      if( !
bee0: 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57  osHeapDestroy(pW
bef0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
bf00: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
bf10: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bf20: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
bf30: 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25  o HeapDestroy (%
bf40: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
bf70: 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e  r(), (void*)pWin
bf80: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b  MemData->hHeap);
bf90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
bfa0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
bfb0: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
bfc0: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
bfd0: 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b  a->hHeap = NULL;
bfe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
bff0: 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c  pulate the low-l
c000: 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  evel memory allo
c010: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  cation function 
c020: 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73  pointers in.** s
c030: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
c040: 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65  ig.m with pointe
c050: 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e  rs to the routin
c060: 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  es in this file.
c070: 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   The.** argument
c080: 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62 6c  s specify the bl
c090: 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
c0a0: 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   manage..**.** T
c0b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
c0c0: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
c0d0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20  lite3_config(), 
c0e0: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a  and therefore.**
c0f0: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
c100: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
c110: 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a  e (it is not)..*
c120: 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
c130: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
c140: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
c150: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
c160: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
c170: 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d  m_methods winMem
c180: 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20  Methods = {.    
c190: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20  winMemMalloc,.  
c1a0: 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20    winMemFree,.  
c1b0: 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c    winMemRealloc,
c1c0: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c  .    winMemSize,
c1d0: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64  .    winMemRound
c1e0: 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e  up,.    winMemIn
c1f0: 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68  it,.    winMemSh
c200: 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e  utdown,.    &win
c210: 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20  _mem_data.  };. 
c220: 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d   return &winMemM
c230: 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20  ethods;.}..void 
c240: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
c250: 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71  ault(void){.  sq
c260: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
c270: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
c280: 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  C, sqlite3MemGet
c290: 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64  Win32());.}.#end
c2a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
c2b0: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
c2c0: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
c2d0: 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  F-8 string to Mi
c2e0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
c2f0: 28 55 54 46 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a  (UTF-16?)..**.**
c300: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
c310: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
c320: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
c330: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  rom malloc..*/.s
c340: 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e  tatic LPWSTR win
c350: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f  Utf8ToUnicode(co
c360: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
c370: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ame){.  int nCha
c380: 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64  r;.  LPWSTR zWid
c390: 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43  eFilename;..  nC
c3a0: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
c3b0: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
c3c0: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
c3d0: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  e, -1, NULL, 0);
c3e0: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
c3f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c400: 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65  .  }.  zWideFile
c410: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
c420: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a  llocZero( nChar*
c430: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
c440: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
c450: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
c460: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c470: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
c480: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
c490: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
c4a0: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
c4b0: 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  1, zWideFilename
c4c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4e0: 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20    nChar);.  if( 
c4f0: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
c500: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
c510: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
c520: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
c530: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
c540: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
c550: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
c560: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
c570: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
c580: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
c590: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
c5a0: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
c5b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
c5c0: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
c5d0: 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65  char *winUnicode
c5e0: 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a  ToUtf8(LPCWSTR z
c5f0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
c600: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
c610: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
c620: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
c630: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
c640: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
c650: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
c660: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
c670: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
c680: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c690: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
c6a0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
c6b0: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
c6c0: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
c6d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c6e0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
c6f0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
c700: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
c710: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
c720: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  1, zFilename, nB
c730: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
c740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c750: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
c760: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
c770: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c780: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
c790: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
c7a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
c7b0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
c7c0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49   Convert an ANSI
c7d0: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
c7e0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61  soft Unicode, ba
c7f0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75  sed on the.** cu
c800: 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73  rrent codepage s
c810: 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65  ettings for file
c820: 20 61 70 69 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   apis..**.** Spa
c830: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
c840: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
c850: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
c860: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
c870: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
c880: 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69  STR winMbcsToUni
c890: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
c8a0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
c8b0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
c8c0: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
c8d0: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
c8e0: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
c8f0: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
c900: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
c910: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
c920: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
c930: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
c940: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
c970: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
c980: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
c990: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
c9a0: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
c9b0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
c9c0: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
c9d0: 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65  sizeof(zMbcsFile
c9e0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
c9f0: 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d  ( zMbcsFilename=
ca00: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ca10: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
ca20: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
ca30: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
ca40: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
ca50: 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  -1, zMbcsFilenam
ca60: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28     nByte);.  if(
ca90: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
caa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
cab0: 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  bcsFilename);.  
cac0: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
cad0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
cae0: 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b  n zMbcsFilename;
caf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
cb00: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
cb10: 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74  ode to multi-byt
cb20: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
cb30: 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ng, based on the
cb40: 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20  .** user's ANSI 
cb50: 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  codepage..**.** 
cb60: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
cb70: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
cb80: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
cb90: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
cba0: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
cbb0: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
cbc0: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
cbd0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
cbe0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
cbf0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
cc00: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
cc10: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
cc20: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
cc30: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
cc40: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
cc50: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
cc60: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
cc70: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
cc80: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
cc90: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
cca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
ccb0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
ccc0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
ccd0: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
cce0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
ccf0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
cd00: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
cd10: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
cd20: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
cd30: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
cd40: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
cd70: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
cd80: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
cd90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
cda0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
cdb0: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
cdc0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
cdd0: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
cde0: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
cdf0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
ce00: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
ce10: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
ce20: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
ce30: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
ce40: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
ce50: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
ce60: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
ce70: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
ce80: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
ce90: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
cea0: 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  meUtf8;.  LPWSTR
ceb0: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
cec0: 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73  mpWide = winMbcs
ced0: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
cee0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
cef0: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
cf00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
cf10: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 77  FilenameUtf8 = w
cf20: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
cf30: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
cf40: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
cf50: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
cf60: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a  ilenameUtf8;.}..
cf70: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54  /*.** Convert UT
cf80: 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65  F-8 to multibyte
cf90: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
cfa0: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
cfb0: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
cfc0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cfd0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
cfe0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
cff0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
d000: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
d010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
d020: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
d030: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20  zFilenameMbcs;. 
d040: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
d050: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
d060: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
d070: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
d080: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
d090: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d0a0: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
d0b0: 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  bcs = winUnicode
d0c0: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29  ToMbcs(zTmpWide)
d0d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
d0e0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
d0f0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62  turn zFilenameMb
d100: 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  cs;.}../*.** Thi
d110: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
d120: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
d130: 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  ry or the tempor
d140: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61  ary directory ba
d150: 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72  sed on.** the pr
d160: 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73  ovided arguments
d170: 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75  .  The type argu
d180: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69  ment must be 1 i
d190: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
d1a0: 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63  he.** data direc
d1b0: 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64  tory or 2 in ord
d1c0: 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65  er to set the te
d1d0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
d1e0: 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a  y.  The zValue.*
d1f0: 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  * argument is th
d200: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
d210: 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20  rectory to use. 
d220: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
d230: 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c  e will be.** SQL
d240: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
d250: 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sful..*/.int sql
d260: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
d270: 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74  irectory(DWORD t
d280: 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61  ype, LPCWSTR zVa
d290: 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70  lue){.  char **p
d2a0: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  pDirectory = 0;.
d2b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d2c0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
d2d0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
d2e0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
d2f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d300: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
d310: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
d320: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
d330: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
d340: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
d350: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
d360: 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tory;.  }else if
d370: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
d380: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
d390: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
d3a0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
d3b0: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
d3c0: 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73  ctory;.  }.  ass
d3d0: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
d3e0: 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54  y || type==SQLIT
d3f0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
d400: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20  ECTORY_TYPE.    
d410: 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53        || type==S
d420: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
d430: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
d440: 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21    );.  assert( !
d450: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73  ppDirectory || s
d460: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61  qlite3MemdebugHa
d470: 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f  sType(*ppDirecto
d480: 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  ry, MEMTYPE_HEAP
d490: 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72  ) );.  if( ppDir
d4a0: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68  ectory ){.    ch
d4b0: 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d  ar *zValueUtf8 =
d4c0: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c   0;.    if( zVal
d4d0: 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20  ue && zValue[0] 
d4e0: 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55  ){.      zValueU
d4f0: 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  tf8 = winUnicode
d500: 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a  ToUtf8(zValue);.
d510: 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c 75        if ( zValu
d520: 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20  eUtf8==0 ){.    
d530: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d540: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
d550: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d560: 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63  e3_free(*ppDirec
d570: 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69  tory);.    *ppDi
d580: 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65  rectory = zValue
d590: 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e  Utf8;.    return
d5a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d5b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d5c0: 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
d5d0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
d5e0: 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72   of winGetLastEr
d5f0: 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72  rorMsg.** is zer
d600: 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
d610: 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
d620: 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
d630: 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
d640: 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
d650: 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
d660: 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
d670: 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
d680: 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45  rMsg(DWORD lastE
d690: 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20  rrno, int nBuf, 
d6a0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f  char *zBuf){.  /
d6b0: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  * FormatMessage 
d6c0: 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69  returns 0 on fai
d6d0: 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65  lure.  Otherwise
d6e0: 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73   it.  ** returns
d6f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54   the number of T
d700: 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f  CHARs written to
d710: 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a   the output.  **
d720: 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69   buffer, excludi
d730: 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ng the terminati
d740: 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20  ng null char..  
d750: 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e  */.  DWORD dwLen
d760: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f   = 0;.  char *zO
d770: 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  ut = 0;..  if( o
d780: 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
d790: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
d7a0: 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69     WCHAR zTempWi
d7b0: 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  de[SQLITE_WIN32_
d7c0: 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53  MAX_ERRMSG_CHARS
d7d0: 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d  +1];.    dwLen =
d7e0: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
d7f0: 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  W(FORMAT_MESSAGE
d800: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d820: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
d830: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
d840: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
d890: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8d0: 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20     zTempWide,.  
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
d900: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d  E_WIN32_MAX_ERRM
d910: 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20  SG_CHARS,.      
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65         0);.#else
d940: 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
d950: 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pWide = NULL;.  
d960: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
d970: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
d980: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
d990: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9b0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
d9c0: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
d9d0: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
da00: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
da10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
da30: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da70: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54            (LPWST
daa0: 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20  R) &zTempWide,. 
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
daf0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64  #endif.    if( d
db00: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
db10: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
db20: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
db30: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
db40: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
db50: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
db60: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e        zOut = win
db70: 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
db80: 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20  empWide);.      
db90: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
dba0: 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53  Malloc();.#if !S
dbb0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
dbc0: 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65       /* free the
dbd0: 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61   system buffer a
dbe0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d  llocated by Form
dbf0: 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20  atMessage */.   
dc00: 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a     osLocalFree(z
dc10: 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69  TempWide);.#endi
dc20: 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  f.    }.  }.#ifd
dc30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
dc40: 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
dc50: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
dc60: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c   = NULL;.    dwL
dc70: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
dc80: 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53  sageA(FORMAT_MES
dc90: 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55  SAGE_ALLOCATE_BU
dca0: 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20  FFER |.         
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
dcd0: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
dce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
dd00: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
dd10: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a            NULL,.
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
dd60: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54       (LPSTR) &zT
ddb0: 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  emp,.           
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77    0);.    if( dw
de00: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
de10: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
de20: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
de30: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
de40: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
de50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
de60: 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69       zOut = sqli
de70: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
de80: 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
de90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
dea0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
deb0: 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65       /* free the
dec0: 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61   system buffer a
ded0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d  llocated by Form
dee0: 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20  atMessage */.   
def0: 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a     osLocalFree(z
df00: 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Temp);.    }.  }
df10: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30 20  .#endif.  if( 0 
df20: 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20  == dwLen ){.    
df30: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
df40: 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73  (nBuf, zBuf, "Os
df50: 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c 75  Error 0x%lx (%lu
df60: 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c  )", lastErrno, l
df70: 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c  astErrno);.  }el
df80: 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20  se{.    /* copy 
df90: 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75  a maximum of nBu
dfa0: 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75  f chars to outpu
dfb0: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  t buffer */.    
dfc0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
dfd0: 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73  (nBuf, zBuf, "%s
dfe0: 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a  ", zOut);.    /*
dff0: 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62   free the UTF8 b
e000: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  uffer */.    sql
e010: 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
e020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
e030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  .}../*.**.** Thi
e040: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e  s function - win
e050: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29  LogErrorAtLine()
e060: 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20   - is only ever 
e070: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
e080: 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72  acro.** winLogEr
e090: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ror()..**.** Thi
e0a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
e0b0: 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72  oked after an er
e0c0: 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e  ror occurs in an
e0d0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a   OS function..**
e0e0: 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61   It logs a messa
e0f0: 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ge using sqlite3
e100: 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e  _log() containin
e110: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  g the current va
e120: 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20  lue of.** error 
e130: 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73  code and, if pos
e140: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
e150: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
e160: 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72  lent from.** For
e170: 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  matMessage..**.*
e180: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
e190: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
e1a0: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
e1b0: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
e1c0: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
e1d0: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
e1e0: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
e1f0: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
e200: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
e210: 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62  ..** The two sub
e220: 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74  sequent argument
e230: 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20  s should be the 
e240: 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66  name of the OS f
e250: 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  unction that.** 
e260: 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20 61  failed and the a
e270: 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73  ssociated file-s
e280: 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61  ystem path, if a
e290: 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77  ny..*/.#define w
e2a0: 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  inLogError(a,b,c
e2b0: 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ,d)   winLogErro
e2c0: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c  rAtLine(a,b,c,d,
e2d0: 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63  __LINE__).static
e2e0: 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72   int winLogError
e2f0: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
e300: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
e310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
e320: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
e330: 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
e340: 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  rno,            
e350: 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73      /* Win32 las
e360: 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e  t error */.  con
e370: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20  st char *zFunc, 
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e390: 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74  Name of OS funct
e3a0: 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20  ion that failed 
e3b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e3c0: 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
e3d0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74       /* File pat
e3e0: 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  h associated wit
e3f0: 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74  h error */.  int
e400: 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20   iLine          
e410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e420: 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62  Source line numb
e430: 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f  er where error o
e440: 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20  ccurred */.){.  
e450: 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20  char zMsg[500]; 
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c  /* Human readabl
e480: 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a  e error text */.
e490: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e4c0: 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20  r */..  zMsg[0] 
e4d0: 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73  = 0;.  winGetLas
e4e0: 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72  tErrorMsg(lastEr
e4f0: 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67  rno, sizeof(zMsg
e500: 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65  ), zMsg);.  asse
e510: 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c  rt( errcode!=SQL
e520: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
e530: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
e540: 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30   = "";.  for(i=0
e550: 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73  ; zMsg[i] && zMs
e560: 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d  g[i]!='\r' && zM
e570: 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b  sg[i]!='\n'; i++
e580: 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20  ){}.  zMsg[i] = 
e590: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  0;.  sqlite3_log
e5a0: 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20  (errcode,.      
e5b0: 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25  "os_win.c:%d: (%
e5c0: 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73 22  lu) %s(%s) - %s"
e5d0: 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c  ,.      iLine, l
e5e0: 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  astErrno, zFunc,
e5f0: 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29   zPath, zMsg.  )
e600: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
e610: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ode;.}../*.** Th
e620: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  e number of time
e630: 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69 6c  s that a ReadFil
e640: 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29  e(), WriteFile()
e650: 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65  , and DeleteFile
e660: 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  ().** will be re
e670: 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  tried following 
e680: 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20  a locking error 
e690: 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65  - probably cause
e6a0: 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72 75  d by.** antiviru
e6b0: 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73  s software.  Als
e6c0: 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65  o the initial de
e6d0: 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 66  lay before the f
e6e0: 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54  irst retry..** T
e6f0: 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73  he delay increas
e700: 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68  es linearly with
e710: 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a   each retry..*/.
e720: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
e730: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
e740: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
e750: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
e760: 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66  RY 10.#endif.#if
e770: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
e780: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
e790: 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  LAY.# define SQL
e7a0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
e7b0: 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23  RETRY_DELAY 25.#
e7c0: 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74  endif.static int
e7d0: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d   winIoerrRetry =
e7e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
e7f0: 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69  ERR_RETRY;.stati
e800: 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65  c int winIoerrRe
e810: 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54  tryDelay = SQLIT
e820: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
e830: 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a  TRY_DELAY;../*.*
e840: 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43  * The "winIoerrC
e850: 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f 20  anRetry1" macro 
e860: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
e870: 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74 69 63  mine if a partic
e880: 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f  ular I/O.** erro
e890: 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65 64 20  r code obtained 
e8a0: 76 69 61 20 47 65 74 4c 61 73 74 45 72 72 6f 72  via GetLastError
e8b0: 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65 20 74  () is eligible t
e8c0: 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 49  o be retried.  I
e8d0: 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65 70 74  t.** must accept
e8e0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
e8f0: 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f 6e 6c  DWORD as its onl
e900: 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  y argument and s
e910: 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20  hould return.** 
e920: 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
e930: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 74 72  error code is tr
e940: 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74 75 72  ansient in natur
e950: 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61 74  e and the operat
e960: 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  ion.** responsib
e970: 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  le for generatin
e980: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65  g the original e
e990: 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63 63 65  rror might succe
e9a0: 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a  ed upon being.**
e9b0: 20 72 65 74 72 69 65 64 2e 20 20 54 68 65 20 61   retried.  The a
e9c0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
e9d0: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
e9e0: 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a  a variable..**.*
e9f0: 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  * Additionally, 
ea00: 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22 77  a macro named "w
ea10: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
ea20: 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e 65 64  " may be defined
ea30: 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 64  .  If it.** is d
ea40: 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c 20  efined, it will 
ea50: 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c  be consulted onl
ea60: 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63 72 6f  y when the macro
ea70: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
ea80: 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ry1".** returns 
ea90: 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69 6e 49  zero.  The "winI
eaa0: 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d  oerrCanRetry2" m
eab0: 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74 65  acro is complete
eac0: 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 0a  ly optional and.
ead0: 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64 20 74  ** may be used t
eae0: 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69 74 69  o include additi
eaf0: 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64 65 73  onal error codes
eb00: 20 69 6e 20 74 68 65 20 73 65 74 20 74 68 61 74   in the set that
eb10: 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75 6c   should.** resul
eb20: 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69 6e 67  t in the failing
eb30: 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 62   I/O operation b
eb40: 65 69 6e 67 20 72 65 74 72 69 65 64 20 62 79 20  eing retried by 
eb50: 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49 66 0a  the caller.  If.
eb60: 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20  ** defined, the 
eb70: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
eb80: 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74 20 65  y2" macro must e
eb90: 78 68 69 62 69 74 20 65 78 74 65 72 6e 61 6c 20  xhibit external 
eba0: 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64 65  semantics.** ide
ebb0: 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73 65 20  ntical to those 
ebc0: 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72  of the "winIoerr
ebd0: 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f  CanRetry1" macro
ebe0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
ebf0: 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  d(winIoerrCanRet
ec00: 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77 69 6e  ry1).#define win
ec10: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 61  IoerrCanRetry1(a
ec20: 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f 41  ) (((a)==ERROR_A
ec30: 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20 20 20  CCESS_DENIED)   
ec40: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
ec70: 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  ROR_SHARING_VIOL
ec80: 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a 20  ATION)    || \. 
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
ecb0: 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49  )==ERROR_LOCK_VI
ecc0: 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20 20 7c  OLATION)       |
ecd0: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44 45    ((a)==ERROR_DE
ed00: 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20 20 20  V_NOT_EXIST)    
ed10: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed30: 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
ed40: 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45 54  OR_NETNAME_DELET
ed50: 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  ED)      || \.  
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
ed80: 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d 45  ==ERROR_SEM_TIME
ed90: 4f 55 54 29 20 20 20 20 20 20 20 20 20 20 7c 7c  OUT)          ||
eda0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
edb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edc0: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
edd0: 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c 45  WORK_UNREACHABLE
ede0: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )).#endif../*.**
edf0: 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28 29   If a ReadFile()
ee00: 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29 20   or WriteFile() 
ee10: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e  error occurs, in
ee20: 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e  voke this routin
ee30: 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69  e.** to see if i
ee40: 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72  t should be retr
ee50: 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ied.  Return TRU
ee60: 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74  E to retry.  Ret
ee70: 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20  urn FALSE.** to 
ee80: 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e 20  give up with an 
ee90: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
eea0: 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49 6f 65   int winRetryIoe
eeb0: 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c  rr(int *pnRetry,
eec0: 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b   DWORD *pError){
eed0: 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47  .  DWORD e = osG
eee0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
eef0: 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77   if( *pnRetry>=w
ef00: 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a  inIoerrRetry ){.
ef10: 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20 29      if( pError )
ef20: 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20  {.      *pError 
ef30: 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = e;.    }.    r
ef40: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
ef50: 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  f( winIoerrCanRe
ef60: 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20 20 73  try1(e) ){.    s
ef70: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
ef80: 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
ef90: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
efa0: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
efb0: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
efc0: 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  1;.  }.#if defin
efd0: 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  ed(winIoerrCanRe
efe0: 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69 66 28  try2).  else if(
eff0: 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72   winIoerrCanRetr
f000: 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  y2(e) ){.    sql
f010: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
f020: 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65  (winIoerrRetryDe
f030: 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
f040: 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
f050: 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
f060: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
f070: 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
f080: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d  *pError = e;.  }
f090: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f0a0: 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20  /*.** Log a I/O 
f0b0: 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69 73  error retry epis
f0c0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
f0d0: 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  oid winLogIoerr(
f0e0: 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69  int nRetry){.  i
f0f0: 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20  f( nRetry ){.   
f100: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
f110: 49 54 45 5f 49 4f 45 52 52 2c 0a 20 20 20 20 20  ITE_IOERR,.     
f120: 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66   "delayed %dms f
f130: 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20  or lock/sharing 
f140: 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20 20 20 20  conflict",.     
f150: 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65   winIoerrRetryDe
f160: 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74  lay*nRetry*(nRet
f170: 72 79 2b 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20  ry+1)/2.    );. 
f180: 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45   }.}..#if SQLITE
f190: 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a  _OS_WINCE./*****
f1a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f1e0: 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63  ****.** This sec
f1f0: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f  tion contains co
f200: 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c  de for WinCE onl
f210: 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  y..*/.#if !defin
f220: 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  ed(SQLITE_MSVC_L
f230: 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c  OCALTIME_API) ||
f240: 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f   !SQLITE_MSVC_LO
f250: 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a  CALTIME_API./*.*
f260: 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20 6f  * The MSVC CRT o
f270: 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61 79  n Windows CE may
f280: 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63 61   not have a loca
f290: 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  ltime() function
f2a0: 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20  .  So.** create 
f2b0: 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f  a substitute..*/
f2c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
f2d0: 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f  h>.struct tm *__
f2e0: 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28  cdecl localtime(
f2f0: 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74 29  const time_t *t)
f300: 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  .{.  static stru
f310: 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54  ct tm y;.  FILET
f320: 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20  IME uTm, lTm;.  
f330: 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a  SYSTEMTIME pTm;.
f340: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
f350: 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b  t64;.  t64 = *t;
f360: 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b 20  .  t64 = (t64 + 
f370: 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30 30  11644473600)*100
f380: 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c  00000;.  uTm.dwL
f390: 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44 57  owDateTime = (DW
f3a0: 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46 46  ORD)(t64 & 0xFFF
f3b0: 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77  FFFFF);.  uTm.dw
f3c0: 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28 44  HighDateTime= (D
f3d0: 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32 29  WORD)(t64 >> 32)
f3e0: 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
f3f0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75  LocalFileTime(&u
f400: 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69  Tm,&lTm);.  osFi
f410: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
f420: 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20  me(&lTm,&pTm);. 
f430: 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d   y.tm_year = pTm
f440: 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a 20  .wYear - 1900;. 
f450: 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e   y.tm_mon = pTm.
f460: 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e  wMonth - 1;.  y.
f470: 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_wday = pTm.wD
f480: 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d  ayOfWeek;.  y.tm
f490: 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79  _mday = pTm.wDay
f4a0: 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20  ;.  y.tm_hour = 
f4b0: 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74  pTm.wHour;.  y.t
f4c0: 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e  m_min = pTm.wMin
f4d0: 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20  ute;.  y.tm_sec 
f4e0: 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20  = pTm.wSecond;. 
f4f0: 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65   return &y;.}.#e
f500: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48 41  ndif..#define HA
f510: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
f520: 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28 28  a) (winFile*)&((
f530: 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f  char*)a)[-(int)o
f540: 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c  ffsetof(winFile,
f550: 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  h)]../*.** Acqui
f560: 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  re a lock on the
f570: 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61   handle h.*/.sta
f580: 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d 75  tic void winceMu
f590: 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44 4c  texAcquire(HANDL
f5a0: 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20 64  E h){.   DWORD d
f5b0: 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20  wErr;.   do {.  
f5c0: 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61 69     dwErr = osWai
f5d0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
f5e0: 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20  (h, INFINITE);. 
f5f0: 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72 72    } while (dwErr
f600: 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f   != WAIT_OBJECT_
f610: 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57 41  0 && dwErr != WA
f620: 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d  IT_ABANDONED);.}
f630: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
f640: 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20 62   lock acquired b
f650: 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75  y winceMutexAcqu
f660: 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ire().*/.#define
f670: 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
f680: 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75 74  se(h) ReleaseMut
f690: 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ex(h)../*.** Cre
f6a0: 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ate the mutex an
f6b0: 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  d shared memory 
f6c0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
f6d0: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
f6e0: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
f6f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
f700: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 63  inceCreateLock(c
f710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
f720: 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70  name, winFile *p
f730: 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52 20  File){.  LPWSTR 
f740: 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a  zTok;.  LPWSTR z
f750: 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61  Name;.  DWORD la
f760: 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20  stErrno;.  BOOL 
f770: 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45 3b  bLogged = FALSE;
f780: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
f790: 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d  TRUE;..  zName =
f7a0: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
f7b0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
f7c0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
f7d0: 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65      /* out of me
f7e0: 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  mory */.    retu
f7f0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
f800: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
f810: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
f820: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
f830: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
f840: 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
f850: 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
f860: 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
f870: 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
f880: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
f890: 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
f8a0: 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
f8b0: 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
f8c0: 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
f8d0: 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
f8e0: 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
f8f0: 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
f900: 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
f910: 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
f920: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
f930: 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
f940: 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
f950: 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
f960: 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
f970: 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
f980: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
f990: 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
f9a0: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f9b0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
f9c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
f9d0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
f9e0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f9f0: 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
fa00: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
fa30: 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
fa40: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  e);.  }..  /* Ac
fa50: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
fa60: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
fa70: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
fa80: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
fa90: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  hMutex);..  /* S
faa0: 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
fab0: 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
fac0: 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
fad0: 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
fae0: 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  re.  ** case-sen
faf0: 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
fb00: 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
fb10: 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
fb20: 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
fb30: 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
fb40: 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
fb50: 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
fb60: 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
fb70: 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
fb80: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
fb90: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
fba0: 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
fbb0: 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
fbc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbe0: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
fbf0: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
fc00: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a         zName);..
fc40: 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20    /* Set a flag 
fc50: 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77  that indicates w
fc60: 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74  e're the first t
fc70: 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d  o create the mem
fc80: 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d  ory so it.  ** m
fc90: 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
fca0: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73  ialized */.  las
fcb0: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
fcc0: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20  stError();.  if 
fcd0: 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52  (lastErrno == ER
fce0: 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
fcf0: 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
fd00: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73   FALSE;.  }..  s
fd10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
fd20: 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
fd30: 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
fd40: 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
fd50: 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
fd60: 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  p it. */.  if( p
fd70: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b  File->hShared ){
fd80: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
fd90: 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
fda0: 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
fdb0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
fdc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49  .             FI
fdd0: 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45  LE_MAP_READ|FILE
fde0: 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30  _MAP_WRITE, 0, 0
fdf0: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
fe00: 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ck));.    /* If 
fe10: 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20  mapping failed, 
fe20: 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64  close the shared
fe30: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61   memory handle a
fe40: 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20  nd erase it */. 
fe50: 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73     if( !pFile->s
fe60: 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70  hared ){.      p
fe70: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
fe80: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
fe90: 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  ();.      winLog
fea0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
feb0: 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
fec0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
fed0: 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
fee0: 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
fef0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c  ename);.      bL
ff00: 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  ogged = TRUE;.  
ff10: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
ff20: 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
ff30: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
ff40: 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a  hShared = NULL;.
ff50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
ff60: 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  If shared memory
ff70: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72   could not be cr
ff80: 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73  eated, then clos
ff90: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
ffa0: 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46  fail */.  if( pF
ffb0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55  ile->hShared==NU
ffc0: 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62  LL ){.    if( !b
ffd0: 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20  Logged ){.      
ffe0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
fff0: 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
10000 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
10010 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
10020 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
10050 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck3", zFilename)
10060 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
10070 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
10080 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
10090 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
100a0 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
100b0 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
100c0 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
100d0 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
100e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
100f0 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20  E_IOERR;.  }..  
10100 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
10110 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
10120 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65  if we're suppose
10130 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49  d to */.  if( bI
10140 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  nit ){.    memse
10150 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c  t(pFile->shared,
10160 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
10170 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77  Lock));.  }..  w
10180 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
10190 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
101a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
101b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
101c0 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f  stroy the part o
101d0 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64  f winFile that d
101e0 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20  eals with wince 
101f0 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20  locks.*/.static 
10200 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f  void winceDestro
10210 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  yLock(winFile *p
10220 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69  File){.  if (pFi
10230 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
10240 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
10250 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
10260 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
10270 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
10280 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
10290 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75  wing blocks shou
102a0 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65  ld probably asse
102b0 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65  rt in debug mode
102c0 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20  , but they.     
102d0 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70    are to cleanup
102e0 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63   in case any loc
102f0 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e  ks remained open
10300 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
10310 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
10320 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  s){.      pFile-
10330 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
10340 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s --;.    }.    
10350 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10360 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20  .bReserved){.   
10370 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
10380 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
10390 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
103a0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
103b0 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
103c0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
103d0 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
103e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
103f0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
10400 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
10410 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
10420 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
10430 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10440 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e   De-reference an
10450 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79  d close our copy
10460 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d   of the shared m
10470 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a  emory handle */.
10480 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f      osUnmapViewO
10490 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61  fFile(pFile->sha
104a0 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  red);.    osClos
104b0 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
104c0 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
104d0 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
104e0 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
104f0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
10500 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
10510 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
10520 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10530 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
10540 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
10550 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
10560 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
10570 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
10580 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
10590 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
105a0 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
105b0 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
105c0 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
105d0 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
105e0 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
105f0 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
10600 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
10610 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
10620 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
10630 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
10640 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
10650 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
10660 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
10670 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
10680 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
10690 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
106a0 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
106b0 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
106c0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
106d0 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
106e0 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
106f0 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
10700 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
10710 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
10720 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
10730 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
10740 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
10750 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
10760 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
10770 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
10780 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
10790 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
107a0 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
107b0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
107c0 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
107d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
107e0 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
107f0 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
10800 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
10810 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
10820 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
10830 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
10840 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
10850 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
10860 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
10870 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
10880 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
10890 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
108a0 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
108b0 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
108c0 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
108d0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
108e0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
108f0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
10900 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
10910 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
10920 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
10930 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10940 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
10950 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
10960 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
10970 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
10980 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
10990 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
109a0 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
109b0 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
109c0 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
109d0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
109e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
109f0 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
10a00 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
10a10 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
10a20 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
10a30 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
10a40 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
10a50 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
10a60 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
10a70 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
10a80 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
10a90 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
10aa0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
10ab0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
10ac0 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
10ad0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
10ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10af0 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
10b00 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
10b10 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
10b20 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
10b30 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
10b40 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
10b50 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
10b60 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
10b70 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
10b80 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
10b90 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
10ba0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
10bb0 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
10bc0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
10bd0 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
10be0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
10bf0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
10c00 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
10c10 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
10c20 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
10c30 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
10c40 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
10c50 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
10c60 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
10c70 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
10c80 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
10c90 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
10ca0 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
10cb0 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
10cc0 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
10cd0 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
10ce0 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
10cf0 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
10d00 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
10d10 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
10d20 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
10d30 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
10d40 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
10d50 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
10d60 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
10d70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10d80 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
10d90 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
10da0 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
10db0 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
10dc0 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
10dd0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
10de0 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
10df0 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
10e00 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
10e10 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
10e20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
10e30 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
10e40 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
10e50 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
10e60 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
10e70 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
10e80 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
10e90 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
10ea0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10eb0 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
10ec0 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
10ed0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
10ee0 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
10ef0 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
10f00 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
10f10 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
10f20 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
10f30 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10f40 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
10f50 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
10f60 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
10f70 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
10f80 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
10f90 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
10fa0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
10fb0 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
10fc0 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
10fd0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
10fe0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
10ff0 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
11000 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
11010 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
11020 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
11030 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11040 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
11050 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
11060 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
11070 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
11080 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
11090 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
110a0 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
110b0 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
110c0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
110d0 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
110e0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
110f0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
11100 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
11110 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
11120 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
11130 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
11140 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
11150 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
11160 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
11170 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
11180 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
11190 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
111a0 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
111b0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
111c0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
111d0 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
111e0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
111f0 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11200 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11210 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
11220 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
11230 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
11240 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
11250 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
11260 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
11270 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
11280 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
11290 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
112a0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
112b0 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
112c0 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
112d0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
112e0 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
112f0 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
11300 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
11310 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
11320 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
11330 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
11340 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
11350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11390 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
113a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
113b0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
113c0 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
113d0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
113e0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
113f0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
11400 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
11410 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
11420 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
11430 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
11440 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
11450 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
11460 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
11470 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
11480 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
11490 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
114a0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
114b0 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
114c0 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
114d0 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
114e0 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
114f0 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
11500 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
11510 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
11530 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
11540 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
11550 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
11560 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
11570 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
11580 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
11590 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
115a0 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
115b0 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
115c0 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
115d0 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
115e0 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
115f0 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
11600 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79   flags, 0, numBy
11610 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
11620 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
11630 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
11640 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68  n osLockFile(*ph
11650 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
11660 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
11670 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11690 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
116a0 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
116b0 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  ** Unlock a file
116c0 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61   region.. */.sta
116d0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f  tic BOOL winUnlo
116e0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
116f0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
11700 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
11710 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
11720 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11730 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
11740 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
11750 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
11760 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
11770 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
11780 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
11790 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
117a0 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
117b0 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
117c0 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20  PI UnlockFile.. 
117d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
117e0 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46  ceUnlockFile(phF
117f0 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
11800 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20  offsetHigh,.    
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
11830 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
11840 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
11850 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
11860 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
11870 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
11880 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
11890 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
118a0 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
118b0 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
118c0 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
118d0 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
118e0 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  n osUnlockFileEx
118f0 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d  (*phFile, 0, num
11900 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
11910 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
11920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
11930 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
11940 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
11950 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
11960 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
11990 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
119a0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
119b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119f0 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
11a00 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
11a10 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
11a20 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
11a30 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
11a40 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
11a50 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
11a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11aa0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
11ab0 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
11ac0 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
11ad0 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
11ae0 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
11af0 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
11b00 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
11b10 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
11b20 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
11b30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
11b40 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
11b50 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
11b60 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
11b70 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  ed as the first.
11b80 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  ** argument to o
11b90 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69  ffset iOffset wi
11ba0 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  thin the file. I
11bb0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
11bc0 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72  turn 0..** Other
11bd0 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
11be0 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
11bf0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
11c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
11c10 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c  nSeekFile(winFil
11c20 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
11c30 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
11c40 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
11c50 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
11c60 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
11c70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
11c80 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
11c90 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
11ca0 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
11cd0 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
11ce0 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
11cf0 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
11d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
11d10 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
11d20 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
11d30 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
11d40 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
11d50 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
11d60 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
11d70 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f  tError() */..  O
11d80 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
11d90 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
11da0 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
11db0 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75   iOffset));..  u
11dc0 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
11dd0 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
11de0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
11df0 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
11e00 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
11e10 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
11e20 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
11e30 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
11e40 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
11e50 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20 2a  urns a dword.  *
11e60 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
11e70 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
11e80 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
11e90 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
11ea0 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
11eb0 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
11ec0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
11ed0 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
11ee0 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a  ing to MSDN,.  *
11ef0 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
11f00 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
11f10 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
11f20 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
11f30 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20   determine.  ** 
11f40 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
11f50 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
11f60 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
11f70 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
11f80 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73  call.  ** GetLas
11f90 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
11fa0 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
11fb0 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
11fc0 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
11fd0 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
11fe0 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
11ff0 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
12000 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
12010 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
12020 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
12030 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
12040 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
12050 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
12060 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
12070 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
12080 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
12090 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
120b0 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
120c0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
120d0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
120e0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
120f0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
12100 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
12110 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
12120 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
12130 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
12140 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
12150 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
12160 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
12170 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
12180 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
12190 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
121a0 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
121b0 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
121c0 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
121d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
121e0 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
121f0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
12220 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
12230 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
12240 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
12250 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
12260 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
12270 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
12280 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
12290 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
122a0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
122b0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
122c0 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
122d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
122e0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
122f0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
12300 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12310 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
12320 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
12330 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
12340 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
12350 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
12360 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
12370 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
12380 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
12390 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
123a0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
123b0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
123c0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
123d0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
123e0 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
123f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
12400 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
12410 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
12420 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
12430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12440 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
12450 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
12460 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
12470 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
12480 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
12490 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
124a0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
124b0 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
124c0 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
124d0 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
124e0 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
124f0 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
12500 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
12510 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
12520 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
12530 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
12540 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
12550 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
12560 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
12570 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
12580 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
12590 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
125a0 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
125b0 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
125c0 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
125d0 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
125e0 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
125f0 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
12600 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
12610 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
12620 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
12630 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
12640 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
12650 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
12660 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
12670 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
12680 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12690 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
126a0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
126b0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
126c0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
126d0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
126e0 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
126f0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
12700 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
12710 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
12720 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
12730 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
12740 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  file=%p\n", pFil
12750 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c  e->h));..#if SQL
12760 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
12770 45 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69  E>0.  winUnmapfi
12780 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69  le(pFile);.#endi
12790 66 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20  f..  do{.    rc 
127a0 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
127b0 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f  pFile->h);.    /
127c0 2a 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f  * SimulateIOErro
127d0 72 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f  r( rc=0; cnt=MX_
127e0 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29  CLOSE_ATTEMPT; )
127f0 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72  ; */.  }while( r
12800 63 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20  c==0 && ++cnt < 
12810 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
12820 20 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e   && (sqlite3_win
12830 33 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31  32_sleep(100), 1
12840 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) );.#if SQLITE_
12850 4f 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65  OS_WINCE.#define
12860 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
12870 41 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e  ATTEMPTS 3.  win
12880 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46  ceDestroyLock(pF
12890 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  ile);.  if( pFil
128a0 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
128b0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  e ){.    int cnt
128c0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
128d0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65  .           osDe
128e0 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d  leteFileW(pFile-
128f0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
12900 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f  ==0.        && o
12910 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
12920 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  esW(pFile->zDele
12930 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66  teOnClose)!=0xff
12940 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 26  ffffff.        &
12950 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f  & cnt++ < WINCE_
12960 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
12970 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  S.    ){.       
12980 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
12990 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
129a0 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
129b0 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
129c0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
129d0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
129e0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
129f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
12a00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69  f( rc ){.    pFi
12a10 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20  le->h = NULL;.  
12a20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  }.  OpenCounter(
12a30 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  -1);.  OSTRACE((
12a40 22 43 4c 4f 53 45 20 66 69 6c 65 3d 25 70 2c 20  "CLOSE file=%p, 
12a50 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
12a60 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
12a70 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
12a80 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
12a90 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
12aa0 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  : winLogError(SQ
12ab0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
12ac0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
12ad0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
12ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
12af0 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d  inClose", pFile-
12b00 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >zPath);.}../*.*
12b10 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
12b20 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
12b30 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
12b40 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
12b50 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
12b60 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
12b70 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
12b80 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
12b90 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
12ba0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61  tatic int winRea
12bb0 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
12bc0 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
12bd0 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20  /* File to read 
12be0 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  from */.  void *
12bf0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
12c00 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f       /* Write co
12c10 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20  ntent into this 
12c20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
12c30 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
12c40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12c50 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
12c60 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
12c70 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
12c80 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
12c90 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65  ng at this offse
12ca0 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c  t */.){.#if !SQL
12cb0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f  ITE_OS_WINCE.  O
12cc0 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
12cd0 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  pped;          /
12ce0 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
12cf0 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65   ReadFile. */.#e
12d00 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
12d10 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
12d20 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68  *)id;  /* file h
12d30 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44  andle */.  DWORD
12d40 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
12d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12d60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
12d70 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  tually read from
12d80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
12d90 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20  Retry = 0;      
12da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12db0 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a  mber of retrys *
12dc0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  /..  assert( id!
12dd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12de0 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
12df0 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a  t( offset>=0 );.
12e00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
12e10 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
12e20 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f  IOERR_READ);.  O
12e30 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
12e40 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70  le=%p, buffer=%p
12e50 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f 66 66  , amount=%d, off
12e60 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  set=%lld, lock=%
12e70 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
12e80 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c   pFile->h, pBuf,
12e90 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46   amt, offset, pF
12ea0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
12eb0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12ec0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f  _MMAP_SIZE>0.  /
12ed0 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d  * Deal with as m
12ee0 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64  uch of this read
12ef0 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
12f00 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
12f10 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
12f20 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
12f30 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
12f40 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
12f50 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
12f60 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
12f70 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
12f80 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
12f90 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
12fa0 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
12fb0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
12fc0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29  ))[offset], amt)
12fd0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
12fe0 28 22 52 45 41 44 2d 4d 4d 41 50 20 66 69 6c 65  ("READ-MMAP file
12ff0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
13000 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
13010 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
13020 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
13030 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
13040 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69  Copy = (int)(pFi
13050 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
13060 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65  ffset);.      me
13070 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
13080 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
13090 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
130a0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
130b0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
130c0 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
130d0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
130e0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
130f0 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
13100 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
13110 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
13120 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70  f( winSeekFile(p
13130 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b  File, offset) ){
13140 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
13150 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
13160 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20  SQLITE_FULL\n", 
13170 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
13190 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  LL;.  }.  while(
131a0 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
131b0 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
131c0 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a  , &nRead, 0) ){.
131d0 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26  #else.  memset(&
131e0 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
131f0 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
13200 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  ));.  overlapped
13210 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
13220 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
13230 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70  ffff);.  overlap
13240 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
13250 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
13260 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
13270 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73  f);.  while( !os
13280 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
13290 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
132a0 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65  Read, &overlappe
132b0 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f  d) &&.         o
132c0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21  sGetLastError()!
132d0 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f  =ERROR_HANDLE_EO
132e0 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  F ){.#endif.    
132f0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
13300 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72  .    if( winRetr
13310 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
13320 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
13330 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c  ntinue;.    pFil
13340 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
13350 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53  astErrno;.    OS
13360 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69 6c  TRACE(("READ fil
13370 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13380 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 20 70  IOERR_READ\n", p
13390 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
133a0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
133b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  r(SQLITE_IOERR_R
133c0 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EAD, pFile->last
133d0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
133e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
133f0 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e  inRead", pFile->
13400 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69  zPath);.  }.  wi
13410 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79  nLogIoerr(nRetry
13420 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28  );.  if( nRead<(
13430 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20  DWORD)amt ){.   
13440 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
13450 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
13460 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
13470 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
13480 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
13490 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e  nRead], 0, amt-n
134a0 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52 41  Read);.    OSTRA
134b0 43 45 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25  CE(("READ file=%
134c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
134d0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22  RR_SHORT_READ\n"
134e0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
134f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13500 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
13510 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
13520 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
13530 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
13540 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
13550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
13570 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
13580 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
13590 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
135a0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
135b0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
135c0 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
135d0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
135e0 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
135f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13610 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
13620 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
13630 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
13640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13650 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
13660 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
13670 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
13680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13690 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
136a0 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
136b0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
136c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
136d0 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
136e0 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
136f0 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
13700 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
13730 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 65   has occurred, e
13740 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77  lse false */.  w
13750 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
13760 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
13770 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * File handle */
13780 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
13790 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
137a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
137b0 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73  retries */..  as
137c0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
137d0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
137e0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
137f0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
13800 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a  E_IOERR_WRITE);.
13810 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
13820 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  llError(return S
13830 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20  QLITE_FULL);..  
13840 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
13850 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d  file=%p, buffer=
13860 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 6f  %p, amount=%d, o
13870 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b  ffset=%lld, lock
13880 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
13890 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75     pFile->h, pBu
138a0 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20  f, amt, offset, 
138b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
138c0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
138d0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
138e0 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
138f0 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
13900 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
13910 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
13920 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
13930 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
13940 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
13950 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
13960 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
13970 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
13980 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
13990 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
139a0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
139b0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
139c0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
139d0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
139e0 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
139f0 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50 20  CE(("WRITE-MMAP 
13a00 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
13a10 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
13a20 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
13a30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
13a50 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29  nt nCopy = (int)
13a60 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  (pFile->mmapSize
13a70 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20   - offset);.    
13a80 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
13a90 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
13aa0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
13ab0 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  Buf, nCopy);.   
13ac0 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
13ad0 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
13ae0 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
13af0 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
13b00 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
13b10 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
13b20 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13b30 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b 46  .  rc = winSeekF
13b40 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
13b50 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  t);.  if( rc==0 
13b60 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e  ){.#else.  {.#en
13b70 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
13b80 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45  OS_WINCE.    OVE
13b90 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70  RLAPPED overlapp
13ba0 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed;        /* Th
13bb0 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69  e offset for Wri
13bc0 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69  teFile. */.#endi
13bd0 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d  f.    u8 *aRem =
13be0 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20   (u8 *)pBuf;    
13bf0 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20      /* Data yet 
13c00 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
13c10 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  .    int nRem = 
13c20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  amt;            
13c30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13c40 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20  bytes yet to be 
13c50 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44  written */.    D
13c60 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20  WORD nWrite;    
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c80 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  Bytes written by
13c90 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28   each WriteFile(
13ca0 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57  ) call */.    DW
13cb0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
13cc0 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56  NO_ERROR;   /* V
13cd0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
13ce0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
13cf0 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
13d00 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d  OS_WINCE.    mem
13d10 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
13d20 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
13d30 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65  APPED));.    ove
13d40 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
13d50 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
13d60 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
13d70 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
13d80 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
13d90 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
13da0 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
13db0 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  dif..    while( 
13dc0 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51  nRem>0 ){.#if SQ
13dd0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13de0 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
13df0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
13e00 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
13e10 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  te, 0) ){.#else.
13e20 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
13e30 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
13e40 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
13e50 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65  rite, &overlappe
13e60 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  d) ){.#endif.   
13e70 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72       if( winRetr
13e80 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
13e90 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
13ea0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
13eb0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
13ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72       assert( nWr
13ed0 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
13ee0 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b  <=(DWORD)nRem );
13ef0 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
13f00 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28  e==0 || nWrite>(
13f10 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20  DWORD)nRem ){.  
13f20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
13f30 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13f40 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
13f50 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  k;.      }.#if !
13f60 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
13f70 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
13f80 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76  nWrite;.      ov
13f90 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
13fa0 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
13fb0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
13fc0 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
13fd0 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
13fe0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
13ff0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
14000 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65  #endif.      aRe
14010 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m += nWrite;.   
14020 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
14030 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
14040 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
14050 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14060 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
14070 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
14080 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
14090 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20   ){.    if(   ( 
140a0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
140b0 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44  ==ERROR_HANDLE_D
140c0 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20  ISK_FULL ).     
140d0 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61    || ( pFile->la
140e0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44  stErrno==ERROR_D
140f0 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20  ISK_FULL )){.   
14100 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
14110 54 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TE file=%p, rc=S
14120 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 20 70  QLITE_FULL\n", p
14130 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
14140 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14150 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  ror(SQLITE_FULL,
14160 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14170 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
14180 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14190 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  Write1", pFile->
141a0 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
141b0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
141c0 45 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  E file=%p, rc=SQ
141d0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
141e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
141f0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
14200 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14210 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69 6c  OERR_WRITE, pFil
14220 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
14230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14240 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 32 22       "winWrite2"
14250 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
14260 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69  .  }else{.    wi
14270 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79  nLogIoerr(nRetry
14280 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
14290 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25 70  (("WRITE file=%p
142a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
142b0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
142c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
142d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  K;.}../*.** Trun
142e0 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
142f0 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
14300 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
14310 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28  int winTruncate(
14320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14330 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
14340 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c  nByte){.  winFil
14350 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
14360 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c  ile*)id;  /* Fil
14370 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20  e handle object 
14380 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
14390 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
143a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
143b0 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e  ode for this fun
143c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44  ction */.  DWORD
143d0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61   lastErrno;..  a
143e0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
143f0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14400 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
14410 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b  IOERR_TRUNCATE);
14420 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
14430 4e 43 41 54 45 20 66 69 6c 65 3d 25 70 2c 20 73  NCATE file=%p, s
14440 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  ize=%lld, lock=%
14450 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
14460 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
14470 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
14480 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
14490 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
144a0 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
144b0 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
144c0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
144d0 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
144e0 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
144f0 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
14500 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
14510 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
14520 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
14530 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
14540 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
14550 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
14560 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
14570 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
14580 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
14590 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
145a0 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
145b0 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
145c0 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
145d0 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  zChunk;.  }..  /
145e0 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29  * SetEndOfFile()
145f0 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
14600 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75  o when successfu
14610 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20  l, or zero when 
14620 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69  it fails. */.  i
14630 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70  f( winSeekFile(p
14640 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a  File, nByte) ){.
14650 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
14660 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
14670 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c  R_TRUNCATE, pFil
14680 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
14690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146a0 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31     "winTruncate1
146b0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
146c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d  ;.  }else if( 0=
146d0 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  =osSetEndOfFile(
146e0 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20  pFile->h) &&.   
146f0 20 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45           ((lastE
14700 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
14710 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f  Error())!=ERROR_
14720 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45  USER_MAPPED_FILE
14730 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
14740 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
14750 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20  Errno;.    rc = 
14760 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
14770 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
14780 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
14790 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
147a0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
147b0 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d  uncate2", pFile-
147c0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69  >zPath);.  }..#i
147d0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
147e0 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66  P_SIZE>0.  /* If
147f0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 74 72   the file was tr
14800 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a  uncated to a siz
14810 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
14820 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  he currently.  *
14830 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c  * mapped region,
14840 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
14850 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69  ctive mapping si
14860 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69  ze as well. SQLi
14870 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65  te will.  ** use
14880 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74   read() and writ
14890 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61  e() to access da
148a0 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70  ta beyond this p
148b0 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e  oint from now on
148c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
148d0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26  le->pMapRegion &
148e0 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  & nByte<pFile->m
148f0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70  mapSize ){.    p
14900 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
14910 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64   nByte;.  }.#end
14920 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
14930 54 52 55 4e 43 41 54 45 20 66 69 6c 65 3d 25 70  TRUNCATE file=%p
14940 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
14950 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
14960 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
14970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
14980 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
14990 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
149a0 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
149b0 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
149c0 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
149d0 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
149e0 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
149f0 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
14a00 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
14a10 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
14a20 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
14a30 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
14a40 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
14a50 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
14a60 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
14a70 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
14a80 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
14a90 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
14aa0 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
14ab0 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69  int winSync(sqli
14ac0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14ad0 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65  t flags){.#ifnde
14ae0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
14af0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
14b00 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45  only when SQLITE
14b10 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
14b20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20  defined..   */. 
14b30 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66   BOOL rc;.#endif
14b40 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
14b50 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65  EBUG) || !define
14b60 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  d(SQLITE_NO_SYNC
14b70 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69  ) || \.    (defi
14b80 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
14b90 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
14ba0 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a  TE_DEBUG)).  /*.
14bb0 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53    ** Used when S
14bc0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73  QLITE_NO_SYNC is
14bd0 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64   not defined and
14be0 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29   by the assert()
14bf0 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54   and/or.  ** OST
14c00 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20  RACE() macros.. 
14c10 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a    */.  winFile *
14c20 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
14c30 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  *)id;.#else.  UN
14c40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
14c50 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  d);.#endif..  as
14c60 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14c70 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
14c80 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
14c90 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
14ca0 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
14cb0 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
14cc0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
14cd0 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
14ce0 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
14cf0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
14d00 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
14d10 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
14d20 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
14d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
14d40 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
14d50 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
14d60 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
14d70 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
14d80 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
14d90 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
14da0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
14db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
14dc0 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  L );..  OSTRACE(
14dd0 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20  ("SYNC file=%p, 
14de0 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25  flags=%x, lock=%
14df0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
14e00 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73   pFile->h, flags
14e10 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
14e20 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e));..#ifndef SQ
14e30 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53  LITE_TEST.  UNUS
14e40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61  ED_PARAMETER(fla
14e50 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gs);.#else.  if(
14e60 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
14e70 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
14e80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
14e90 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
14ea0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
14eb0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
14ec0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
14ed0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
14ee0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
14ef0 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
14f00 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
14f10 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
14f20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
14f30 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d   OSTRACE(("SYNC-
14f40 4e 4f 50 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NOP file=%p, rc=
14f50 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
14f60 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
14f70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
14f80 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75  lse.  rc = osFlu
14f90 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
14fa0 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c  ile->h);.  Simul
14fb0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46  ateIOError( rc=F
14fc0 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63  ALSE );.  if( rc
14fd0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
14fe0 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c 20  ("SYNC file=%p, 
14ff0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
15000 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15020 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
15030 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15040 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
15050 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  r();.    OSTRACE
15060 28 28 22 53 59 4e 43 20 66 69 6c 65 3d 25 70 2c  (("SYNC file=%p,
15070 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
15080 5f 46 53 59 4e 43 5c 6e 22 2c 20 70 46 69 6c 65  _FSYNC\n", pFile
15090 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
150a0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
150b0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
150c0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
150d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
150e0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
150f0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
15100 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  th);.  }.#endif.
15110 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
15120 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
15130 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
15140 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
15150 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
15160 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
15170 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
15180 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46   *pSize){.  winF
15190 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
151a0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
151b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
151c0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
151d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
151e0 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d  Size!=0 );.  Sim
151f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
15200 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15210 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52 41  _FSTAT);.  OSTRA
15220 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25  CE(("SIZE file=%
15230 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20  p, pSize=%p\n", 
15240 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29  pFile->h, pSize)
15250 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
15260 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20  S_WINRT.  {.    
15270 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e  FILE_STANDARD_IN
15280 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28  FO info;.    if(
15290 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d   osGetFileInform
152a0 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28  ationByHandleEx(
152b0 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74  pFile->h, FileSt
152c0 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20  andardInfo,.    
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69   &info, sizeof(i
15300 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a  nfo)) ){.      *
15310 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64  pSize = info.End
15320 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b  OfFile.QuadPart;
15330 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15340 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
15350 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
15360 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
15370 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
15380 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
15390 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
153a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
153b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
153c0 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d  ileSize", pFile-
153d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
153e0 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20   }.#else.  {.   
153f0 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73   DWORD upperBits
15400 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65  ;.    DWORD lowe
15410 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
15420 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20   lastErrno;..   
15430 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47   lowerBits = osG
15440 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65  etFileSize(pFile
15450 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29  ->h, &upperBits)
15460 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28  ;.    *pSize = (
15470 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
15480 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20  upperBits)<<32) 
15490 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  + lowerBits;.   
154a0 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74   if(   (lowerBit
154b0 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  s == INVALID_FIL
154c0 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26  E_SIZE).       &
154d0 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
154e0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
154f0 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a  )!=NO_ERROR) ){.
15500 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
15510 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
15520 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  no;.      rc = w
15530 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15540 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70  E_IOERR_FSTAT, p
15550 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
15560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15570 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65          "winFile
15580 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Size", pFile->zP
15590 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
155a0 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
155b0 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c  (("SIZE file=%p,
155c0 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a   pSize=%p, *pSiz
155d0 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22  e=%lld, rc=%s\n"
155e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
155f0 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70  le->h, pSize, *p
15600 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Size, sqlite3Err
15610 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
15620 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15630 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  * LOCKFILE_FAIL_
15640 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75  IMMEDIATELY is u
15650 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65  ndefined on some
15660 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
15670 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43  ..*/.#ifndef LOC
15680 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
15690 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20  IATELY.# define 
156a0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
156b0 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64  MEDIATELY 1.#end
156c0 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  if..#ifndef LOCK
156d0 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
156e0 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  OCK.# define LOC
156f0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
15700 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 2.#endif../
15710 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c  *.** Historicall
15720 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75 73  y, SQLite has us
15730 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b  ed both the Lock
15740 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c  File and LockFil
15750 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  eEx functions..*
15760 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46  * When the LockF
15770 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ile function was
15780 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c   used, it was al
15790 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
157a0 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61   fail.** immedia
157b0 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
157c0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62   could not be ob
157d0 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69  tained.  Also, i
157e0 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  t always expecte
157f0 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61  d to.** obtain a
15800 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
15810 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 61  .  These flags a
15820 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65  re used with the
15830 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
15840 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c  tion.** and refl
15850 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63 74  ect those expect
15860 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72  ations; therefor
15870 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e  e, they should n
15880 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  ot be changed..*
15890 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
158a0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a  _LOCKFILE_FLAGS.
158b0 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
158c0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20  LOCKFILE_FLAGS  
158d0 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f   (LOCKFILE_FAIL_
158e0 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a  IMMEDIATELY | \.
158f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55    LOCKFILE_EXCLU
15920 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69  SIVE_LOCK).#endi
15930 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74  f../*.** Current
15940 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72  ly, SQLite never
15950 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46   calls the LockF
15960 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77  ileEx function w
15970 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74  ithout wanting t
15980 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61  he.** call to fa
15990 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  il immediately i
159a0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
159b0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a  t be obtained..*
159c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
159d0 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
159e0 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
159f0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
15a00 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  GS (LOCKFILE_FAI
15a10 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23  L_IMMEDIATELY).#
15a20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  endif../*.** Acq
15a30 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f  uire a reader lo
15a40 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ck..** Different
15a50 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
15a60 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
15a70 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
15a80 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
15a90 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win9x or WinNT..
15aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
15ab0 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e  nGetReadLock(win
15ac0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
15ad0 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52 41  int res;.  OSTRA
15ae0 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66  CE(("READ-LOCK f
15af0 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c  ile=%p, lock=%d\
15b00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
15b10 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
15b20 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
15b30 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
15b40 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20  _WINCE.    /*.  
15b50 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
15b60 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
15b70 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
15b80 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
15b90 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20  f the Win32.    
15ba0 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63  **       API Loc
15bb0 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a  kFileEx..    */.
15bc0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c      res = winceL
15bd0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15be0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
15bf0 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65   0, 1, 0);.#else
15c00 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
15c10 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
15c20 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
15c30 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  EEX_FLAGS, SHARE
15c40 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
15c70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
15c80 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
15c90 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
15ca0 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20  e{.    int lk;. 
15cb0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
15cc0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29  mness(sizeof(lk)
15cd0 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c  , &lk);.    pFil
15ce0 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
15cf0 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20  e = (short)((lk 
15d00 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53  & 0x7fffffff)%(S
15d10 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29  HARED_SIZE - 1))
15d20 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
15d30 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
15d40 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
15d50 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69  SHARED_FIRST+pFi
15d80 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
15d90 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
15da0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
15db0 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70  es == 0 ){.    p
15dc0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
15dd0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
15de0 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ();.    /* No ne
15df0 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c  ed to log a fail
15e00 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  ure to lock */. 
15e10 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52   }.  OSTRACE(("R
15e20 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  EAD-LOCK file=%p
15e30 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20  , result=%d\n", 
15e40 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b  pFile->h, res));
15e50 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
15e60 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72  ../*.** Undo a r
15e70 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  eadlock.*/.stati
15e80 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52  c int winUnlockR
15e90 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
15ea0 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
15eb0 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  es;.  DWORD last
15ec0 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45  Errno;.  OSTRACE
15ed0 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
15ee0 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c  ile=%p, lock=%d\
15ef0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
15f00 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
15f10 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
15f20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  ){.    res = win
15f30 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15f40 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
15f50 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
15f60 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64  ZE, 0);.  }.#ifd
15f70 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
15f80 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
15f90 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
15fa0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
15fb0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
15fc0 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f  +pFile->sharedLo
15fd0 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29  ckByte, 0, 1, 0)
15fe0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
15ff0 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c  f( res==0 && ((l
16000 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
16010 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52  LastError())!=ER
16020 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20  ROR_NOT_LOCKED) 
16030 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
16040 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
16050 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
16060 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
16070 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d  R_UNLOCK, pFile-
16080 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
16090 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
160a0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c  UnlockReadLock",
160b0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
160c0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
160d0 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65  READ-UNLOCK file
160e0 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e  =%p, result=%d\n
160f0 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
16100 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  ));.  return res
16110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
16120 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
16130 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
16140 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
16150 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
16160 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16170 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
16180 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
16190 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
161a0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
161b0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
161c0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
161d0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
161e0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
161f0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
16200 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
16210 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
16220 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
16230 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
16240 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
16250 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
16260 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
16270 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
16280 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
16290 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
162a0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
162b0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
162c0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
162d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
162e0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
162f0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
16300 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
16310 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
16320 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
16330 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
16340 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
16350 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
16360 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
16370 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
16380 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
16390 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
163a0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
163b0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
163c0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
163d0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
163e0 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
163f0 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
16400 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
16410 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
16420 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
16430 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
16440 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
16450 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
16460 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
16470 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
16480 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
16490 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
164a0 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
164b0 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
164c0 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
164d0 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
164e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
164f0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
16500 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16510 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
16520 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
16530 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
16540 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
16550 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
16560 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f   of a Windows lo
16570 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
16580 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
16590 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
165a0 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
165b0 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
165c0 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
165d0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
165e0 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
165f0 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
16600 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
16610 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
16620 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
16630 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
16640 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
16650 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28  RROR;..  assert(
16660 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52   id!=0 );.  OSTR
16670 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d  ACE(("LOCK file=
16680 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25  %p, oldLock=%d(%
16690 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e  d), newLock=%d\n
166a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
166b0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
166c0 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e  ocktype, pFile->
166d0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
166e0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
166f0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
16700 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
16710 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
16720 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
16730 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
16740 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
16750 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
16760 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
16770 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
16780 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
16790 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
167a0 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
167b0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
167c0 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
167d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
167e0 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20  K-HELD file=%p, 
167f0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16800 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16820 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
16830 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
16840 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
16850 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73  orrect.  */.  as
16860 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
16870 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  ktype!=NO_LOCK |
16880 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  | locktype==SHAR
16890 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
168a0 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50  ert( locktype!=P
168b0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
168c0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
168d0 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e!=RESERVED_LOCK
168e0 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   || pFile->lockt
168f0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
16900 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74   );..  /* Lock t
16910 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
16920 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20  byte if we need 
16930 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e  to acquire a PEN
16940 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a  DING lock or.  *
16950 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  * a SHARED lock.
16960 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75    If we are acqu
16970 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
16980 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69  ock, the acquisi
16990 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65  tion of.  ** the
169a0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
169b0 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e  te is temporary.
169c0 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74  .  */.  newLockt
169d0 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  ype = pFile->loc
169e0 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28  ktype;.  if(   (
169f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
16a00 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c  =NO_LOCK).     |
16a10 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d  | (   (locktype=
16a20 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
16a30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46  .         && (pF
16a40 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52  ile->locktype==R
16a50 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20  ESERVED_LOCK)). 
16a60 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
16a70 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 3;.    while( 
16a80 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
16a90 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
16aa0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
16ab0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47           PENDING
16af0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29  _BYTE, 0, 1, 0))
16b00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
16b10 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67  Try 3 times to g
16b20 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  et the pending l
16b30 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ock.  This is ne
16b40 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20  eded to work.   
16b50 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f     ** around pro
16b60 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
16b70 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20  indexing and/or 
16b80 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77  anti-virus softw
16b90 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  are on.      ** 
16ba0 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
16bb0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75  .      ** If you
16bc0 20 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20   are using this 
16bd0 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20  code as a model 
16be0 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  for alternative 
16bf0 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20  VFSes, do not.  
16c00 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73      ** copy this
16c10 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49   retry logic.  I
16c20 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65  t is a hack inte
16c30 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73  nded for Windows
16c40 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a   only..      */.
16c50 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
16c60 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
16c70 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ();.      OSTRAC
16c80 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47  E(("LOCK-PENDING
16c90 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63  -FAIL file=%p, c
16ca0 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c 74 3d  ount=%d, result=
16cb0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
16cc0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
16cd0 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20 20 20  cnt, res));.    
16ce0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
16cf0 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44 5f 48  =ERROR_INVALID_H
16d00 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  ANDLE ){.       
16d10 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16d20 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
16d30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
16d40 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
16d50 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
16d60 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d  "LOCK-FAIL file=
16d70 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 63  %p, count=%d, rc
16d80 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
16d90 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16da0 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65 33 45  h, cnt, sqlite3E
16db0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
16dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16de0 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65 33  f( cnt ) sqlite3
16df0 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29 3b  _win32_sleep(1);
16e00 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50 65  .    }.    gotPe
16e10 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73 3b  ndingLock = res;
16e20 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29 7b  .    if( !res ){
16e30 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
16e40 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16e50 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
16e60 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 73    /* Acquire a s
16e70 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  hared lock.  */.
16e80 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
16e90 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SHARED_LOCK && r
16ea0 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
16eb0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
16ec0 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
16ed0 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74 52 65    res = winGetRe
16ee0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
16ef0 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
16f00 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
16f10 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
16f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16f30 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16f40 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
16f60 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
16f70 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
16f80 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
16f90 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  VED_LOCK && res 
16fa0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16fb0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
16fc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
16fd0 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
16fe0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
16ff0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
17000 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f  FLAGS, RESERVED_
17010 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
17020 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
17030 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
17040 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   = RESERVED_LOCK
17050 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17060 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
17070 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
17080 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17090 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
170a0 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
170b0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
170c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
170d0 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63  es ){.    newLoc
170e0 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
170f0 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e  LOCK;.    gotPen
17100 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
17110 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
17120 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
17130 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
17140 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
17150 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
17160 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
17170 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  e->locktype>=SHA
17180 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
17190 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52  res = winUnlockR
171a0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
171b0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
171c0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
171d0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
171e0 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46  _FLAGS, SHARED_F
171f0 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20  IRST, 0,.       
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17210 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
17220 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
17230 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
17240 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
17250 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
17260 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
17270 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
17280 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74 52 65  ;.      winGetRe
17290 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
172a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
172b0 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67  f we are holding
172c0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
172d0 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65  that ought to be
172e0 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a   released, then.
172f0 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20    ** release it 
17300 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
17310 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26  gotPendingLock &
17320 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
17330 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
17340 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
17350 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
17360 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
17370 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
17380 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
17390 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
173a0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
173b0 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
173c0 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
173d0 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
173e0 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
173f0 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
17400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
17410 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
17420 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
17430 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53  rrno;.    rc = S
17440 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
17450 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46  OSTRACE(("LOCK-F
17460 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77 61 6e  AIL file=%p, wan
17470 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64 5c 6e  ted=%d, got=%d\n
17480 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17490 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79  pFile->h, lockty
174a0 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
174b0 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e  );.  }.  pFile->
174c0 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e  locktype = (u8)n
174d0 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53  ewLocktype;.  OS
174e0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c  TRACE(("LOCK fil
174f0 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
17500 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
17510 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
17520 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
17530 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
17540 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
17550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17560 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
17570 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
17580 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
17590 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
175a0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
175b0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
175c0 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
175d0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72   lock is held, r
175e0 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
175f0 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  o, otherwise zer
17600 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
17610 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65   winCheckReserve
17620 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
17630 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
17640 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 65 73  sOut){.  int res
17650 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
17660 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
17670 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
17680 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
17690 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
176a0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
176b0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
176c0 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
176d0 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  p, pResOut=%p\n"
176e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73  , pFile->h, pRes
176f0 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  Out));..  assert
17700 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( id!=0 );.  if(
17710 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
17720 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
17730 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31 3b 0a  ){.    res = 1;.
17740 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
17750 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ST-WR-LOCK file=
17760 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20 28 6c  %p, result=%d (l
17770 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
17780 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d 65 6c  >h, res));.  }el
17790 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  se{.    res = wi
177a0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
177b0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
177c0 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52 45 53  FILEEX_FLAGS,RES
177d0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
177e0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
177f0 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e  s ){.      winUn
17800 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17810 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
17820 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
17830 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65   }.    res = !re
17840 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  s;.    OSTRACE((
17850 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
17860 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
17870 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46   (remote)\n", pF
17880 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
17890 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
178a0 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  res;.  OSTRACE((
178b0 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
178c0 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25  le=%p, pResOut=%
178d0 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20  p, *pResOut=%d, 
178e0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
178f0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17900 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a  e->h, pResOut, *
17910 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
17920 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17930 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
17940 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
17950 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
17960 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
17970 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
17980 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
17990 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
179a0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
179b0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
179c0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
179d0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
179e0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
179f0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
17a00 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
17a10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
17a20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
17a30 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
17a40 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
17a50 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
17a60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
17a70 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
17a80 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
17a90 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
17aa0 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
17ab0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
17ac0 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
17ad0 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
17ae0 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
17af0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17b00 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
17b10 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
17b20 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
17b30 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
17b40 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17b50 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
17b60 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
17b70 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
17b80 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
17b90 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
17ba0 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
17bb0 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
17bc0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
17bd0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
17be0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
17bf0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
17c00 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
17c10 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
17c20 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
17c30 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
17c40 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
17c50 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
17c60 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
17c70 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
17c80 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
17c90 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
17ca0 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74  _LOCK && !winGet
17cb0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20  ReadLock(pFile) 
17cc0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
17cd0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
17ce0 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64  ppen.  We should
17cf0 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20   always be able 
17d00 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63  to.      ** reac
17d10 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
17d20 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ock */.      rc 
17d30 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
17d40 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
17d50 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  K, osGetLastErro
17d60 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
17d70 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
17d80 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  Unlock", pFile->
17d90 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
17da0 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45  }.  if( type>=RE
17db0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
17dc0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
17dd0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
17de0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
17df0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
17e00 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
17e10 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
17e20 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
17e30 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
17e40 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
17e50 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c   type>=PENDING_L
17e60 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
17e70 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17e80 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
17e90 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
17ea0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
17eb0 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
17ec0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
17ed0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
17ee0 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
17ef0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17f00 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
17f10 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
17f20 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
17f30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17f40 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
17f50 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
17f60 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
17f70 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
17f80 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
17f90 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
17fa0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
17fb0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
17fc0 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
17fd0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
17fe0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
17ff0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
18000 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
18010 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
18020 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18030 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
18040 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
18050 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
18060 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
18070 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
18080 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
18090 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
180a0 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
180b0 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
180c0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
180d0 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
180e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
180f0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
18100 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
18110 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
18120 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
18130 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
18140 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
18150 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
18160 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73  winGetTempname(s
18170 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68  qlite3_vfs *, ch
18180 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69  ar **);.static i
18190 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
181a0 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  t void *);.stati
181b0 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76  c BOOL winIsDriv
181c0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
181d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
181e0 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e  /*.** Control an
181f0 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f  d query of the o
18200 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
18210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18220 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  inFileControl(sq
18230 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18240 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
18250 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  rg){.  winFile *
18260 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
18270 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28  *)id;.  OSTRACE(
18280 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18290 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c   op=%d, pArg=%p\
182a0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70  n", pFile->h, op
182b0 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74  , pArg));.  swit
182c0 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
182d0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
182e0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
182f0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
18300 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18310 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
18320 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
18330 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
18340 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
18350 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18360 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
18370 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
18380 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
18390 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
183a0 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  nt)pFile->lastEr
183b0 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rno;.      OSTRA
183c0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
183d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
183e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
183f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
18400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18410 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
18420 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
18430 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
18440 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
18450 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53  *)pArg;.      OS
18460 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
18470 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18480 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18490 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
184a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
184b0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
184c0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
184d0 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  T: {.      if( p
184e0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
184f0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18500 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a  e3_int64 oldSz;.
18510 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
18520 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c   winFileSize(id,
18530 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20   &oldSz);.      
18540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18550 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18560 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
18570 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33  ewSz = *(sqlite3
18580 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
18590 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53          if( newS
185a0 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20  z>oldSz ){.     
185b0 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
185c0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
185d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
185e0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64  = winTruncate(id
185f0 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20  , newSz);.      
18600 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
18610 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
18620 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53      }.        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 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
18660 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
18670 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
18680 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18690 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
186a0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
186b0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
186c0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
186d0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
186e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
186f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
18700 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
18710 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
18720 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
18730 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
18740 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
18750 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
18760 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
18770 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
18780 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
18790 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
187a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
187b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
187c0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
187d0 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
187e0 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
187f0 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
18800 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
18810 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
18820 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
18830 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
18840 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
18850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18860 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
18870 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
18880 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
18890 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
188a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
188b0 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
188c0 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
188d0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
188e0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
188f0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
18900 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
18910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
18920 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
18930 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
18940 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
18950 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
18960 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
18970 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
18980 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
18990 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  y = a[0];.      
189a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
189b0 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [0] = winIoerrRe
189c0 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  try;.      }.   
189d0 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b     if( a[1]>0 ){
189e0 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72  .        winIoer
189f0 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b  rRetryDelay = a[
18a00 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
18a10 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20  .        a[1] = 
18a20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
18a30 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ay;.      }.    
18a40 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
18a50 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
18a60 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
18a70 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
18a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18a90 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
18aa0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73  ITE_TEST.    cas
18ab0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
18ac0 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a  IN32_SET_HANDLE:
18ad0 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c   {.      LPHANDL
18ae0 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41  E phFile = (LPHA
18af0 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20  NDLE)pArg;.     
18b00 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65   HANDLE hOldFile
18b10 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
18b20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70     pFile->h = *p
18b30 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68  hFile;.      *ph
18b40 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b  File = hOldFile;
18b50 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
18b60 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25  "FCNTL oldFile=%
18b70 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72  p, newFile=%p, r
18b80 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
18ba0 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  OldFile, pFile->
18bb0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
18bc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
18bd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
18be0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
18bf0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
18c00 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
18c10 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  le = 0;.      in
18c20 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d  t rc = winGetTem
18c30 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
18c40 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20  s, &zTFile);.   
18c50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18c60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18c70 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
18c80 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
18c90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18ca0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18cb0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
18cc0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
18cd0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
18ce0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18cf0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
18d00 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
18d10 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
18d20 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
18d30 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
18d40 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
18d50 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
18d60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
18d70 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
18d80 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18d90 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
18da0 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
18db0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18dc0 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
18dd0 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
18de0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
18df0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
18e00 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
18e10 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
18e20 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
18e30 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
18e40 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
18e50 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
18e60 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
18e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
18e80 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
18e90 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55  {.          winU
18ea0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
18eb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
18ec0 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
18ed0 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
18ee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
18ef0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
18f00 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
18f10 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
18f20 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
18f30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18f40 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
18f50 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
18f60 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
18f70 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
18f80 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
18f90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18fa0 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
18fb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18fc0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
18fd0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
18fe0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
18ff0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
19000 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
19010 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
19020 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
19030 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
19040 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
19050 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
19060 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
19070 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
19080 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
19090 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
190a0 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
190b0 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
190c0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
190d0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
190e0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
190f0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
19100 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
19110 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
19120 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
19130 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
19140 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
19150 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
19160 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
19170 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
19180 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
19190 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
191a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
191b0 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
191c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
191d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
191e0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
191f0 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
19200 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
19210 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
19220 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
19230 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
19240 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
19250 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
19260 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
19270 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
19280 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
19290 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
192a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f  ;.}../*.** Windo
192b0 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
192c0 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
192d0 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
192e0 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
192f0 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
19300 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
19310 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
19320 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
19330 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
19340 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
19350 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
19360 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45  .*/.static SYSTE
19370 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
19380 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o;..#ifndef SQLI
19390 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
193a0 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
193b0 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
193c0 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
193d0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
193e0 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
193f0 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
19400 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
19410 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
19420 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69  ed by.** this fi
19430 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
19440 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62   may be shared b
19450 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
19460 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
19470 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  on winShmMutexHe
19480 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
19490 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
194a0 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a  e global mutex.*
194b0 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
194c0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
194d0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
194e0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
194f0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
19500 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
19510 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
19520 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
19530 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
19540 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
19550 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
19560 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
19570 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  d winShmEnterMut
19580 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
19590 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
195a0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
195b0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
195c0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
195d0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
195e0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76  nShmLeaveMutex(v
195f0 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
19600 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
19610 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
19620 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
19630 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
19640 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
19650 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75  tic int winShmMu
19660 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
19670 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
19680 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
19690 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
196a0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
196b0 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65  C_MASTER));.}.#e
196c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  ndif../*.** Obje
196d0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
196e0 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69  sent a single fi
196f0 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d  le opened and mm
19700 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65  apped to provide
19710 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  .** shared memor
19720 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  y.  When multipl
19730 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
19740 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
19750 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c  .** log-summary,
19760 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
19770 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65   its own winFile
19780 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
19790 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74  y all.** point t
197a0 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
197b0 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
197c0 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
197d0 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67  rds, each.** log
197e0 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e  -summary is open
197f0 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ed only once per
19800 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
19810 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
19820 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
19830 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
19840 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
19850 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
19860 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
19870 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
19880 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
19890 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20  *      nRef.**  
198a0 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20      pNext.**.** 
198b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
198c0 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
198d0 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
198e0 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
198f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  **.**      fid.*
19900 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
19910 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69  .**.** Either wi
19920 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  nShmNode.mutex m
19930 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77  ust be held or w
19940 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  inShmNode.nRef==
19950 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d  0 and.** winShmM
19960 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
19970 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
19980 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
19990 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
199a0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
199b0 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  .**.*/.struct wi
199c0 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c  nShmNode {.  sql
199d0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
199e0 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
199f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
19a00 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
19a10 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
19a20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
19a30 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
19a40 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20  winFile hFile;  
19a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19a60 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77  le handle from w
19a70 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74  inOpen */..  int
19a80 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
19a90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
19aa0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
19ab0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
19ac0 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
19ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
19ae0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
19af0 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  on */.  struct S
19b00 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48  hmRegion {.    H
19b10 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
19b20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
19b30 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61  handle from Crea
19b40 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f  teFileMapping */
19b50 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b  .    void *pMap;
19b60 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20  .  } *aRegion;. 
19b70 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
19b80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
19b90 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
19ba0 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
19bb0 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69  /O error */..  i
19bc0 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
19bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19be0 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62  ber of winShm ob
19bf0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
19c00 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
19c10 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
19c20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69         /* All wi
19c30 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
19c40 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
19c50 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
19c60 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
19c70 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66   Next in list of
19c80 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
19c90 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65  objects */.#ifde
19ca0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
19cb0 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19cd0 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69  ext available wi
19ce0 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  nShm.id value */
19cf0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
19d00 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79  * A global array
19d10 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
19d20 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a  de objects..**.*
19d30 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65  * The winShmMute
19d40 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
19d50 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69  true while readi
19d60 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
19d70 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  is list..*/.stat
19d80 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77  ic winShmNode *w
19d90 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
19da0 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  0;../*.** Struct
19db0 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
19dc0 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
19dd0 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
19de0 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
19df0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
19e00 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
19e10 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19e20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
19e30 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
19e40 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
19e50 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
19e60 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
19e70 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e  er:.**.**    win
19e80 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20  Shm.pShmNode.** 
19e90 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a     winShm.id.**.
19ea0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
19eb0 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
19ec0 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e  te.  The winShm.
19ed0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
19ee0 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
19ef0 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
19f00 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
19f10 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
19f20 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53   winShm {.  winS
19f30 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
19f40 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  ;      /* The un
19f50 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e  derlying winShmN
19f60 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
19f70 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  winShm *pNext;  
19f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
19f90 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74  xt winShm with t
19fa0 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f  he same winShmNo
19fb0 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
19fc0 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
19fd0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
19fe0 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d  lding the winShm
19ff0 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
1a000 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
1a010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1a020 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
1a030 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
1a040 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
1a050 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
1a060 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
1a070 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
1a080 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1a090 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a0b0 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
1a0c0 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69  tion with its wi
1a0d0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  nShmNode */.#end
1a0e0 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
1a0f0 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
1a100 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
1a110 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20  ne WIN_SHM_BASE 
1a120 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
1a130 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
1a140 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
1a150 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
1a160 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20   WIN_SHM_DMS    
1a170 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51  (WIN_SHM_BASE+SQ
1a180 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
1a190 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
1a1a0 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
1a1b0 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ly advisory lock
1a1c0 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65  s for all n byte
1a1d0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f  s beginning at o
1a1e0 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  fst..*/.#define 
1a1f0 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64  _SHM_UNLCK  1.#d
1a200 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b  efine _SHM_RDLCK
1a210 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    2.#define _SHM
1a220 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
1a230 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
1a240 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
1a250 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
1a260 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
1a270 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
1a280 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
1a290 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
1a2a0 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f  pe,         /* _
1a2b0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f  SHM_UNLCK, _SHM_
1a2c0 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57  RDLCK, or _SHM_W
1a2d0 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
1a2e0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1a2f0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
1a300 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
1a310 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
1a320 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
1a330 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a340 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
1a350 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
1a360 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1a370 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
1a380 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
1a390 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45  Lock/UnlockFileE
1a3a0 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  x() */..  /* Acc
1a3b0 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68  ess to the winSh
1a3c0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
1a3d0 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1a3e0 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1a3f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1a400 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
1a410 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d  mutex) || pFile-
1a420 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f  >nRef==0 );..  O
1a430 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1a440 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
1a450 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73  %d, offset=%d, s
1a460 69 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ize=%d\n",.     
1a470 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69        pFile->hFi
1a480 6c 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20  le.h, lockType, 
1a490 6f 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a  ofst, nByte));..
1a4a0 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71    /* Release/Acq
1a4b0 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d  uire the system-
1a4c0 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20  level lock */.  
1a4d0 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53  if( lockType==_S
1a4e0 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
1a4f0 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  rc = winUnlockFi
1a500 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
1a510 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  .h, ofst, 0, nBy
1a520 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  te, 0);.  }else{
1a530 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1a540 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
1a550 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
1a560 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d   DWORD dwFlags =
1a570 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
1a580 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20  MMEDIATELY;.    
1a590 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  if( lockType == 
1a5a0 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46  _SHM_WRLCK ) dwF
1a5b0 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45  lags |= LOCKFILE
1a5c0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b  _EXCLUSIVE_LOCK;
1a5d0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
1a5e0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46  kFile(&pFile->hF
1a5f0 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20  ile.h, dwFlags, 
1a600 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
1a610 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  0);.  }..  if( r
1a620 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20  c!= 0 ){.    rc 
1a630 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1a640 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1a650 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73  >lastErrno =  os
1a660 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1a670 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a680 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  BUSY;.  }..  OST
1a690 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1a6a0 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73  file=%p, func=%s
1a6b0 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d  , errno=%lu, rc=
1a6c0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1a6d0 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68    pFile->hFile.h
1a6e0 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  , (lockType == _
1a6f0 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69  SHM_UNLCK) ? "wi
1a700 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20  nUnlockFile" :. 
1a710 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f            "winLo
1a720 63 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e  ckFile", pFile->
1a730 6c 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74  lastErrno, sqlit
1a740 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1a750 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1a760 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1a770 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
1a780 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
1a790 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
1a7a0 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
1a7b0 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
1a7c0 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
1a7d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
1a7e0 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
1a7f0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
1a800 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
1a810 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
1a820 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
1a830 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
1a840 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
1a850 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
1a860 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
1a870 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
1a880 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
1a890 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
1a8a0 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
1a8b0 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
1a8c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1a8d0 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
1a8e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
1a8f0 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
1a900 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
1a910 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
1a920 70 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  p;.  assert( win
1a930 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
1a940 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1a950 4d 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c  M-PURGE pid=%lu,
1a960 20 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e   deleteFlag=%d\n
1a970 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1a980 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1a990 73 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61  sId(), deleteFla
1a9a0 67 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  g));.  pp = &win
1a9b0 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
1a9c0 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
1a9d0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
1a9e0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1a9f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1aa00 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73  f( p->mutex ){ s
1aa10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1aa20 65 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20  e(p->mutex); }. 
1aa30 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1aa40 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
1aa50 7b 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62  {.        BOOL b
1aa60 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77  Rc = osUnmapView
1aa70 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f  OfFile(p->aRegio
1aa80 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20  n[i].pMap);.    
1aa90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1aaa0 4d 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69  M-PURGE-UNMAP pi
1aab0 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64  d=%lu, region=%d
1aac0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1aae0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1aaf0 49 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22  Id(), i, bRc ? "
1ab00 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1ab10 3b 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44  ;.        UNUSED
1ab20 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28  _VARIABLE_VALUE(
1ab30 62 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52  bRc);.        bR
1ab40 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  c = osCloseHandl
1ab50 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1ab60 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  hMap);.        O
1ab70 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1ab80 47 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  GE-CLOSE pid=%lu
1ab90 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1aba0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1abb0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1abc0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1abd0 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1abe0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1abf0 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1ac00 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1ac10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ac20 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e  f( p->hFile.h!=N
1ac30 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e  ULL && p->hFile.
1ac40 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
1ac50 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
1ac60 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1ac70 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1ac80 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
1ac90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1aca0 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
1acb0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1acc0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1acd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
1ace0 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
1acf0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1ad00 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1ad10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1ad20 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
1ad30 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
1ad40 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
1ad50 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
1ad60 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
1ad70 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
1ad80 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ad90 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1ada0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1adb0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
1adc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1add0 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
1ade0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1adf0 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
1ae00 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
1ae10 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
1ae20 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
1ae30 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
1ae40 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
1ae50 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69  with database fi
1ae60 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20  le pDbFd..**.** 
1ae70 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
1ae80 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
1ae90 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
1aea0 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
1aeb0 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
1aec0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
1aed0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
1aee0 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
1aef0 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
1af00 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
1af10 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
1af20 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
1af30 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
1af40 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
1af50 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  int winOpenShare
1af60 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20  dMemory(winFile 
1af70 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
1af80 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20  t winShm *p;    
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1afa0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1afb0 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
1afc0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
1afd0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1afe0 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  0;   /* The unde
1aff0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
1b000 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b030 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
1b040 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1b050 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
1b060 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
1b070 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65  cated winShmNode
1b080 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b0b0 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74   of zName in byt
1b0c0 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1b0d0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
1b0e0 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
1b0f0 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
1b100 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
1b110 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
1b120 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
1b130 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
1b140 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
1b150 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
1b160 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
1b170 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
1b180 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
1b190 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
1b1a0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
1b1b0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1b1c0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1b1d0 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  OMEM;.  nName = 
1b1e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1b1f0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1b200 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1b210 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1b220 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1b230 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1b240 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1b250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1b260 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1b270 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1b280 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46  ;.  }.  pNew->zF
1b290 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
1b2a0 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c  )&pNew[1];.  sql
1b2b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e  ite3_snprintf(nN
1b2c0 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46  ame+15, pNew->zF
1b2d0 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
1b2e0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1b2f0 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53  ;.  sqlite3FileS
1b300 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
1b310 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ath, pNew->zFile
1b320 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  name);..  /* Loo
1b330 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72  k to see if ther
1b340 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67  e is an existing
1b350 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74   winShmNode that
1b360 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20   can be used..  
1b370 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e  ** If no matchin
1b380 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72  g winShmNode cur
1b390 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63  rently exists, c
1b3a0 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e  reate a new one.
1b3b0 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  .  */.  winShmEn
1b3c0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f  terMutex();.  fo
1b3d0 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e  r(pShmNode = win
1b3e0 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68  ShmNodeList; pSh
1b3f0 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d  mNode; pShmNode=
1b400 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29  pShmNode->pNext)
1b410 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65  {.    /* TBD nee
1b420 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74  d to come up wit
1b430 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68  h better match h
1b440 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20  ere.  Perhaps.  
1b450 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44    ** use FILE_ID
1b460 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53  _BOTH_DIR_INFO S
1b470 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  tructure..    */
1b480 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1b490 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65  StrICmp(pShmNode
1b4a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65  ->zFilename, pNe
1b4b0 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30  w->zFilename)==0
1b4c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
1b4d0 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
1b4e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b4f0 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pNew);.  }else{
1b500 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  .    pShmNode = 
1b510 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d  pNew;.    pNew =
1b520 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c   0;.    ((winFil
1b530 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e*)(&pShmNode->h
1b540 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41  File))->h = INVA
1b550 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1b560 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
1b570 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f  pNext = winShmNo
1b580 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53  deList;.    winS
1b590 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68  hmNodeList = pSh
1b5a0 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d  mNode;..    pShm
1b5b0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
1b5c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
1b5d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
1b5e0 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
1b5f0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
1b600 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b610 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1b620 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1b630 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1b640 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f  }..    rc = winO
1b650 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  pen(pDbFd->pVfs,
1b660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b670 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c    pShmNode->zFil
1b680 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  ename,          
1b690 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1b6a0 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a  e file (UTF-8) *
1b6b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1b6c0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1b6d0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1b6e0 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  le,  /* File han
1b6f0 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  dle here */.    
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b710 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53  ITE_OPEN_WAL | S
1b720 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1b730 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
1b740 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20  EN_CREATE,.     
1b750 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
1b760 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
1b770 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67  K!=rc ){.      g
1b780 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1b790 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b7a0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1b7b0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
1b7c0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
1b7d0 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
1b7e0 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74      ** If not, t
1b7f0 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1b800 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e   to zero length.
1b810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b820 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1b830 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1b840 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  WRLCK, WIN_SHM_D
1b850 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f  MS, 1)==SQLITE_O
1b860 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1b870 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c  winTruncate((sql
1b880 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
1b890 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29  mNode->hFile, 0)
1b8a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b8b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b8c0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1b8d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1b8e0 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65  RR_SHMOPEN, osGe
1b8f0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53         "winOpenS
1b920 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1b930 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  h);.      }.    
1b940 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1b950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b960 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1b970 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1b980 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1b990 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72  DMS, 1);.      r
1b9a0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1b9b0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1b9c0 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_RDLCK, WIN_S
1b9d0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1b9e0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  }.    if( rc ) g
1b9f0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1ba00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1ba10 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
1ba20 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
1ba30 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  he winShmNode */
1ba40 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  .  p->pShmNode =
1ba50 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65   pShmNode;.#ifde
1ba60 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1ba70 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
1ba80 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
1ba90 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
1baa0 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
1bab0 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
1bac0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1bad0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1bae0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1baf0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1bb00 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1bb10 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1bb20 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1bb30 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  he winShmEnterMu
1bb40 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
1bb50 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
1bb60 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
1bb70 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62  truct winShm) ob
1bb80 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
1bb90 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
1bba0 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
1bbb0 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
1bbc0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
1bbd0 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
1bbe0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
1bbf0 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
1bc00 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
1bc10 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
1bc20 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
1bc30 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
1bc40 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  utex.  ** mutex.
1bc50 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1bc60 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1bc70 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1bc80 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1bc90 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1bca0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1bcb0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1bcc0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1bcd0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1bce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bcf0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
1bd00 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
1bd10 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
1bd20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1bd30 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1bd40 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _UNLCK, WIN_SHM_
1bd50 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68  DMS, 1);.  winSh
1bd60 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
1bd70 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20  fs, 0);      /* 
1bd80 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20  This call frees 
1bd90 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75  pShmNode if requ
1bda0 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ired */.  sqlite
1bdb0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c  3_free(p);.  sql
1bdc0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1bdd0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1bde0 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
1bdf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
1be00 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  se a connection 
1be10 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  to shared-memory
1be20 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e  .  Delete the un
1be30 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72  derlying.** stor
1be40 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
1be50 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g is true..*/.st
1be60 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55  atic int winShmU
1be70 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
1be80 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1be90 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1bea0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1beb0 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65  mory */.  int de
1bec0 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
1bed0 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
1bee0 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20  fter closing if 
1bef0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  true */.){.  win
1bf00 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
1bf10 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
1bf20 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  olding shared-me
1bf30 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1bf40 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1bf50 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1bf60 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
1bf70 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1bf80 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
1bf90 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
1bfa0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
1bfb0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b  /.  winShm **pp;
1bfc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1bfd0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
1bfe0 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
1bff0 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  s */..  pDbFd = 
1c000 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
1c010 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
1c020 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
1c030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c040 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
1c050 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  pShmNode;..  /* 
1c060 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
1c070 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
1c080 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
1c090 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
1c0a0 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
1c0b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c0c0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1c0d0 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
1c0e0 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
1c0f0 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
1c100 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
1c110 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
1c120 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
1c130 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
1c140 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
1c150 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
1c160 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
1c170 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c180 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1c190 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
1c1a0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
1c1b0 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
1c1c0 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
1c1d0 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
1c1e0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
1c1f0 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  o */.  winShmEnt
1c200 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
1c210 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
1c220 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
1c230 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
1c240 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1c250 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53  f==0 ){.    winS
1c260 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
1c270 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  Vfs, deleteFlag)
1c280 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65  ;.  }.  winShmLe
1c290 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
1c2a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c2b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
1c2c0 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
1c2d0 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
1c2e0 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
1c2f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1c300 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
1c310 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1c320 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1c330 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
1c340 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1c350 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c370 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
1c380 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1c390 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c3c0 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
1c3d0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
1c3e0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1c400 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
1c410 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
1c420 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
1c430 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
1c440 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1c450 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
1c460 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed memory */.  w
1c470 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
1c480 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
1c490 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
1c4a0 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
1c4b0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53  locked */.  winS
1c4c0 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4e0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1c4f0 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
1c500 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  gs */.  winShmNo
1c510 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
1c520 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
1c530 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c550 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1c560 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
1c570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c590 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
1c5a0 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
1c5b0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
1c5c0 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
1c5d0 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
1c5e0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1c5f0 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
1c600 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
1c610 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
1c620 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1c630 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1c640 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1c650 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1c660 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
1c670 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1c680 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1c690 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
1c6a0 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
1c6b0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
1c6c0 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
1c6d0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
1c6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
1c6f0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
1c700 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
1c710 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
1c720 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f   = (u16)((1U<<(o
1c730 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
1c740 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
1c750 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
1c760 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
1c770 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1c780 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1c790 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
1c7a0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
1c7b0 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
1c7c0 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
1c7d0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
1c7e0 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
1c7f0 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
1c800 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
1c810 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
1c820 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1c830 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1c840 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1c850 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
1c860 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
1c870 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
1c880 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
1c890 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
1c8a0 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
1c8b0 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
1c8c0 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1c8d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
1c8e0 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
1c8f0 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
1c900 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
1c910 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
1c920 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1c930 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1c940 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
1c950 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1c960 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
1c970 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1c980 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
1c990 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
1c9a0 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
1c9b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
1c9d0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
1c9e0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
1c9f0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
1ca00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1ca10 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1ca20 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
1ca30 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
1ca40 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
1ca50 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
1ca60 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
1ca70 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
1ca80 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
1ca90 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
1caa0 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
1cab0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1cac0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
1cad0 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
1cae0 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
1caf0 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
1cb00 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
1cb10 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
1cb20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
1cb30 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1cb40 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1cb50 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1cb60 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1cb70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1cb80 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
1cb90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1cba0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
1cbb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1cbc0 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
1cbd0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1cbe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1cbf0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
1cc00 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1cc10 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
1cc20 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1cc30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cc40 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
1cc50 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1cc60 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1cc70 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1cc80 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1cc90 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1cca0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
1ccb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1ccc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ccd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1cce0 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
1ccf0 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
1cd00 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1cd10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cd20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
1cd30 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
1cd40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
1cd50 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
1cd60 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
1cd70 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
1cd80 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
1cd90 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
1cda0 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1cdb0 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1cdc0 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
1cdd0 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1cde0 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1cdf0 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1ce00 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1ce10 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1ce20 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
1ce30 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1ce40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ce50 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1ce60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1ce70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ce80 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1ce90 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1cea0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1ceb0 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1cec0 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1ced0 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1cee0 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1cef0 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1cf00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cf10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1cf20 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1cf30 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
1cf40 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
1cf50 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
1cf60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1cf70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cf80 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
1cf90 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
1cfa0 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
1cfb0 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
1cfc0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
1cfd0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1cfe0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1cff0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1d000 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1d010 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69  -LOCK pid=%lu, i
1d020 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b  d=%d, sharedMask
1d030 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d  =%03x, exclMask=
1d040 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %03x, rc=%s\n",.
1d050 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d060 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d070 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68  (), p->id, p->sh
1d080 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
1d090 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
1d0a0 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65    sqlite3ErrName
1d0b0 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
1d0c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
1d0d0 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
1d0e0 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
1d0f0 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
1d100 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  ed memory..**.**
1d110 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73   All loads and s
1d120 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f  tores begun befo
1d130 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d  re the barrier m
1d140 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66  ust complete bef
1d150 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20  ore.** any load 
1d160 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61  or store begun a
1d170 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72  fter the barrier
1d180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d190 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a   winShmBarrier(.
1d1a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1d1b0 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  fd          /* D
1d1c0 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
1d1d0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1d1e0 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
1d1f0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1d200 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69    /* MemoryBarri
1d210 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f  er(); // does no
1d220 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74  t work -- do not
1d230 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f   know why not */
1d240 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1d250 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c  tex();.  winShmL
1d260 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
1d270 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1d280 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1d290 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
1d2a0 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
1d2b0 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68  ion of the.** sh
1d2c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f  ared-memory asso
1d2d0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1d2e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64  database file fd
1d2f0 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  . Shared-memory 
1d300 72 65 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e  regions.** are n
1d310 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
1d320 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
1d330 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
1d340 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
1d350 6e 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  n.** bytes in si
1d360 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
1d370 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1d380 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1d390 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
1d3a0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1d3b0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1d3c0 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
1d3d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
1d3e0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
1d3f0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
1d400 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
1d410 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1d420 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
1d430 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
1d440 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
1d450 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
1d460 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
1d470 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
1d480 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1d490 20 49 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69   If.** isWrite i
1d4a0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
1d4b0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
1d4c0 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1d4d0 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a  n has not yet.**
1d4e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1d4f0 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
1d500 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1d510 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
1d520 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1d530 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
1d540 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
1d550 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
1d560 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
1d570 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1d580 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
1d590 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
1d5a0 70 72 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64  processes.** add
1d5b0 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69  ress space (if i
1d5c0 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1d5d0 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  ), *pp is set to
1d5e0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61   point to the ma
1d5f0 70 70 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  pped.** memory a
1d600 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1d610 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1d620 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a   int winShmMap(.
1d630 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1d640 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1d650 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
1d660 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
1d670 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
1d680 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
1d690 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
1d6a0 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
1d6b0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
1d6e0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ions */.  int is
1d6f0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
1d700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d710 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
1d720 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1d730 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
1d740 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
1d750 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
1d760 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
1d770 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
1d780 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a  = (winFile*)fd;.
1d790 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
1d7a0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e  bFd->pShm;.  win
1d7b0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1d7c0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1d7d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
1d7e0 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  !p ){.    rc = w
1d7f0 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1d800 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
1d810 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d820 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d830 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
1d840 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64  m;.  }.  pShmNod
1d850 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1d860 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
1d870 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1d880 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
1d890 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
1d8a0 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
1d8b0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
1d8c0 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69  egion==0 );..  i
1d8d0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
1d8e0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
1d8f0 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d 52  .    struct ShmR
1d900 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20  egion *apNew;   
1d910 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
1d920 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
1d930 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
1d940 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a  = (iRegion+1)*sz
1d950 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69  Region;  /* Mini
1d960 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
1d970 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71  e size */.    sq
1d980 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20  lite3_int64 sz; 
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
1d9b0 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69   of wal-index fi
1d9c0 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e  le */..    pShmN
1d9d0 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20  ode->szRegion = 
1d9e0 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f  szRegion;..    /
1d9f0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
1da00 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
1da10 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
1da20 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
1da30 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43   space..    ** C
1da40 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
1da50 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
1da60 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
1da70 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
1da80 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65   is.    ** large
1da90 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61   enough to conta
1daa0 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  in the requested
1dab0 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f   region)..    */
1dac0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c  .    rc = winFil
1dad0 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66  eSize((sqlite3_f
1dae0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1daf0 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20  >hFile, &sz);.  
1db00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1db10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1db20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1db30 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
1db40 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
1db50 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1db70 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64  nShmMap1", pDbFd
1db80 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1db90 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1dba0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1dbb0 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20   sz<nByte ){.   
1dbc0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1dbd0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1dbe0 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
1dbf0 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20  . If isWrite is 
1dc00 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  set to.      ** 
1dc10 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79  zero, exit early
1dc20 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
1dc30 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
1dc40 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1dc50 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1dc60 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
1dc70 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73  y, if isWrite is
1dc80 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66   non-zero, use f
1dc90 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c  truncate() to al
1dca0 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  locate.      ** 
1dcb0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1dcc0 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20  mory region..   
1dcd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1dce0 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20  !isWrite ) goto 
1dcf0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1dd00 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
1dd10 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
1dd20 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
1dd30 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1dd40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dd50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1dd60 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1dd70 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1dd80 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
1dd90 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c     "winShmMap2",
1ddc0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1ddd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1dde0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
1ddf0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1de00 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74 65  Map the requeste
1de10 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1de20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1de30 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
1de40 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20  e. */.    apNew 
1de50 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65 67  = (struct ShmReg
1de60 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65  ion *)sqlite3_re
1de70 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
1de80 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1de90 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69  , (iRegion+1)*si
1dea0 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20  zeof(apNew[0]). 
1deb0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
1dec0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
1ded0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1dee0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1def0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1df00 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
1df10 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e  e->aRegion = apN
1df20 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  ew;..    while( 
1df30 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1df40 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  n<=iRegion ){.  
1df50 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 20      HANDLE hMap 
1df60 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
1df70 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20  /* file-mapping 
1df80 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
1df90 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20  void *pMap = 0; 
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1dfb0 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  apped memory reg
1dfc0 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  ion */..#if SQLI
1dfd0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1dfe0 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
1dff0 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1e000 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  App(pShmNode->hF
1e010 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
1e020 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1e030 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55  WRITE, nByte, NU
1e040 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
1e050 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1e060 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
1e070 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
1e080 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1e090 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gW(pShmNode->hFi
1e0a0 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  le.h,.          
1e0b0 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57  NULL, PAGE_READW
1e0c0 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20  RITE, 0, nByte, 
1e0d0 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65  NULL.      );.#e
1e0e0 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1e0f0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1e100 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  I).      hMap = 
1e110 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
1e120 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
1e130 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
1e140 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1e150 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1e160 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1e170 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
1e180 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
1e190 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
1e1a0 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
1e1b0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
1e1c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1e1d0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1e1e0 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1e1f0 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
1e210 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
1e220 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
1e230 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
1e240 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1e250 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1e260 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e270 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
1e280 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
1e290 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
1e2a0 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
1e2b0 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
1e2c0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
1e2d0 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
1e2e0 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
1e2f0 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
1e300 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
1e310 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
1e320 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
1e330 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
1e340 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
1e350 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
1e360 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
1e370 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
1e380 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
1e390 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
1e3a0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
1e3b0 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
1e3c0 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
1e3d0 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
1e3e0 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
1e3f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
1e400 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1e410 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  P-MAP pid=%lu, r
1e420 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74  egion=%d, offset
1e430 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
1e440 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
1e450 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e460 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e470 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
1e480 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20  ion, iOffset,.  
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e4a0 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20  zRegion, pMap ? 
1e4b0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
1e4c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e4d0 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
1e4e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e4f0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e500 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e510 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1e520 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e530 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d  ERR_SHMMAP, pShm
1e540 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  Node->lastErrno,
1e550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e560 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
1e570 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
1e580 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
1e590 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
1e5a0 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
1e5b0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
1e5c0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
1e5d0 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
1e5e0 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
1e5f0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
1e600 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
1e610 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1e620 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
1e630 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
1e640 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
1e650 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
1e660 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
1e670 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
1e680 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
1e690 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
1e6a0 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
1e6b0 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
1e6c0 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1e6d0 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1e6e0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1e6f0 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1e700 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
1e710 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
1e720 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
1e730 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
1e740 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
1e750 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
1e760 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
1e770 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e780 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1e790 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1e7a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1e7b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
1e7c0 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
1e7d0 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
1e7e0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1e7f0 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
1e800 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
1e810 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
1e820 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
1e830 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
1e840 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
1e850 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
1e860 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
1e870 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
1e880 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1e890 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
1e8a0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
1e8b0 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
1e8c0 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
1e8d0 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
1e8e0 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
1e8f0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1e900 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
1e910 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
1e920 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
1e930 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
1e940 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
1e950 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
1e960 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e970 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1e980 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
1e990 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
1e9a0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
1e9b0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1e9c0 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
1e9d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
1e9e0 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
1e9f0 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
1ea00 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1ea10 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
1ea20 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1ea30 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1ea40 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1ea50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1ea60 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1ea70 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1ea80 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1ea90 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
1eaa0 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
1eac0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
1ead0 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
1eae0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1eaf0 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
1eb00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
1eb10 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
1eb20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1eb30 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1eb40 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1eb50 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
1eb80 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
1eb90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
1eba0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
1ebb0 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1ebc0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
1ebd0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1ebe0 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
1ebf0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
1ec00 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
1ec10 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
1ec20 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
1ec30 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
1ec40 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1ec50 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1ec60 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
1ec70 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
1ec80 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
1ec90 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
1eca0 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1ecc0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ecd0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1ece0 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
1ecf0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1ed00 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ed10 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1ed20 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
1ed50 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1ed60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1ed70 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
1ed80 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1ed90 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
1eda0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1edb0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1edc0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1edd0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1ede0 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
1edf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ee00 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
1ee10 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
1ee20 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
1ee30 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1ee40 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
1ee50 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
1ee60 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
1ee70 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
1ee80 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
1ee90 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74  ew). Or, if.** t
1eea0 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
1eeb0 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
1eec0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
1eed0 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
1eee0 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
1eef0 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
1ef00 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
1ef10 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1ef20 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
1ef30 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
1ef40 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
1ef50 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
1ef60 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 0a  quested size of.
1ef70 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
1ef80 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
1ef90 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
1efa0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
1efb0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71   then the.** req
1efc0 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
1efd0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1efe0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
1eff0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1f000 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
1f010 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
1f020 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1f030 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
1f040 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75   configured.** u
1f050 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
1f060 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69  L_MMAP_SIZE, whi
1f070 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
1f080 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
1f090 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1f0a0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f0b0 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
1f0c0 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
1f0d0 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
1f0e0 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
1f0f0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1f100 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
1f110 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
1f120 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
1f130 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
1f140 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73  (winFile *pFd, s
1f150 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
1f160 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  te){.  sqlite3_i
1f170 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74  nt64 nMap = nByt
1f180 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
1f190 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
1f1a0 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
1f1b0 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  t==0 );.  OSTRAC
1f1c0 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
1f1d0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1f1e0 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  size=%lld\n",.  
1f1f0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1f200 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1f210 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a  , pFd, nByte));.
1f220 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
1f230 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
1f240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1f250 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
1f260 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1f270 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
1f280 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20  )pFd, &nMap);.  
1f290 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1f2a0 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1f2b0 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1f2c0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1f2d0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22  E_IOERR_FSTAT\n"
1f2e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f2f0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1f300 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
1f310 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f320 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1f330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1f340 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
1f350 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
1f360 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
1f370 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d  izeMax;.  }.  nM
1f380 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f  ap &= ~(sqlite3_
1f390 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66  int64)(winSysInf
1f3a0 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31  o.dwPageSize - 1
1f3b0 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d  );..  if( nMap==
1f3c0 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69  0 && pFd->mmapSi
1f3d0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55  ze>0 ){.    winU
1f3e0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
1f3f0 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70   }.  if( nMap!=p
1f400 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
1f410 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1f420 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72   0;.    DWORD pr
1f430 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
1f440 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44  DONLY;.    DWORD
1f450 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41   flags = FILE_MA
1f460 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e  P_READ;..    win
1f470 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
1f480 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74      if( (pFd->ct
1f490 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
1f4a0 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  E_RDONLY)==0 ){.
1f4b0 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20        protect = 
1f4c0 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a  PAGE_READWRITE;.
1f4d0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46        flags |= F
1f4e0 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20  ILE_MAP_WRITE;. 
1f4f0 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
1f500 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64  OS_WINRT.    pFd
1f510 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
1f520 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
1f530 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  App(pFd->h, NULL
1f540 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c  , protect, nMap,
1f550 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1f560 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1f570 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1f580 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1f590 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1f5a0 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  W(pFd->h, NULL, 
1f5b0 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1f5e0 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1f5f0 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1f620 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1f630 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1f640 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
1f650 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1f660 49 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  I).    pFd->hMap
1f670 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1f680 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68 2c 20  appingA(pFd->h, 
1f690 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20  NULL, protect,. 
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f6c0 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32  DWORD)((nMap>>32
1f6d0 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  ) & 0xffffffff),
1f6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f700 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20   (DWORD)(nMap & 
1f710 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c  0xffffffff), NUL
1f720 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  L);.#endif.    i
1f730 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55  f( pFd->hMap==NU
1f740 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d  LL ){.      pFd-
1f750 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1f760 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1f770 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1f780 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1f790 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61  RR_MMAP, pFd->la
1f7a0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7c0 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c 20 70  "winMapfile1", p
1f7d0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1f7e0 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72 72    /* Log the err
1f7f0 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75 65  or, but continue
1f800 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
1f810 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57  n using xRead/xW
1f820 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53  rite */.      OS
1f830 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
1f840 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c  -CREATE pid=%lu,
1f850 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
1f860 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1f870 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
1f880 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
1f890 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1f8a0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1f8b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f8c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1f8d0 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53 79 73  ( (nMap % winSys
1f8e0 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 29  Info.dwPageSize)
1f8f0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1f900 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f 54  t( sizeof(SIZE_T
1f910 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  )==sizeof(sqlite
1f920 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d 61 70  3_int64) || nMap
1f930 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29 3b 0a  <=0xffffffff );.
1f940 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1f950 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  NRT.    pNew = o
1f960 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
1f970 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61 70 2c  omApp(pFd->hMap,
1f980 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49 5a 45   flags, 0, (SIZE
1f990 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73 65 0a  _T)nMap);.#else.
1f9a0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
1f9b0 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64 2d 3e  ViewOfFile(pFd->
1f9c0 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20  hMap, flags, 0, 
1f9d0 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29  0, (SIZE_T)nMap)
1f9e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
1f9f0 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pNew==NULL ){. 
1fa00 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
1fa10 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20  le(pFd->hMap);. 
1fa20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d       pFd->hMap =
1fa30 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70 46 64   NULL;.      pFd
1fa40 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1fa50 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1fa60 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1fa70 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1fa80 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c  ERR_MMAP, pFd->l
1fa90 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22 2c 20   "winMapfile2", 
1fac0 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
1fad0 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65 72     /* Log the er
1fae0 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e 75  ror, but continu
1faf0 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69  e normal operati
1fb00 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  on using xRead/x
1fb10 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 4f  Write */.      O
1fb20 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
1fb30 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  E-MAP pid=%lu, p
1fb40 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
1fb50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fb60 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1fb70 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1fb80 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1fb90 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
1fba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1fbb0 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61    }.    pFd->pMa
1fbc0 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a  pRegion = pNew;.
1fbd0 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
1fbe0 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46  e = nMap;.    pF
1fbf0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
1fc00 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20  l = nMap;.  }.. 
1fc10 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
1fc20 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
1fc30 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1fc40 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
1fc50 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1fc60 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29  rocessId(), pFd)
1fc70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1fc80 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1fc90 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
1fca0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
1fcb0 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
1fcc0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1fcd0 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
1fce0 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
1fcf0 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
1fd00 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
1fd10 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
1fd20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
1fd30 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
1fd40 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
1fd50 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
1fd60 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
1fd70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
1fd80 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
1fd90 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
1fda0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1fdb0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
1fdc0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1fdd0 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
1fde0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
1fdf0 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
1fe00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1fe10 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
1fe20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
1fe30 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
1fe40 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1fe50 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
1fe60 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
1fe70 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
1fe80 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
1fe90 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74  lly.** release t
1fea0 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20  he reference by 
1feb0 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74  calling winUnfet
1fec0 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ch()..*/.static 
1fed0 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c  int winFetch(sql
1fee0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
1fef0 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
1ff00 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23  t, void **pp){.#
1ff10 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1ff20 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46  AP_SIZE>0.  winF
1ff30 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
1ff40 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
1ff50 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1ff60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65  abase file */.#e
1ff70 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  ndif.  *pp = 0;.
1ff80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
1ff90 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
1ffa0 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
1ffb0 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70  d, amount=%d, pp
1ffc0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
1ffd0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1ffe0 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
1fff0 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29  iOff, nAmt, pp))
20000 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
20010 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
20020 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
20030 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
20040 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
20050 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
20060 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c  t rc = winMapfil
20070 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
20080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f  _OK ){.        O
200a0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
200b0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
200c0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
200e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
200f0 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
20100 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
20110 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20120 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
20130 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
20140 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
20150 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
20160 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
20170 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
20180 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
20190 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
201a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
201b0 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20  OSTRACE(("FETCH 
201c0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
201d0 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70  p, pp=%p, *pp=%p
201e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
201f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
20200 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
20210 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a  sId(), fd, pp, *
20220 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pp));.  return S
20230 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20240 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
20250 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
20260 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
20270 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65  function release
20280 73 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  s a.** reference
20290 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20   obtained by an 
202a0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
202b0 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65 20  winFetch(). The 
202c0 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
202d0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
202e0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  s function must 
202f0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
20300 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
20310 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61  .** argument tha
20320 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  t was passed to 
20330 74 68 65 20 77 69 6e 46 65 74 63 68 28 29 20 69  the winFetch() i
20340 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  nvocation..**.**
20350 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
20360 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
20370 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
20380 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
20390 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69 6e 66  called.** to inf
203a0 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65  orm the VFS laye
203b0 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e  r that, accordin
203c0 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20  g to POSIX, any 
203d0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
203e0 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
203f0 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
20400 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
20410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
20420 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
20430 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
20440 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69  ff, void *p){.#i
20450 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
20460 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69  P_SIZE>0.  winFi
20470 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69  le *pFd = (winFi
20480 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  le*)fd;   /* The
20490 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
204a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
204b0 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
204c0 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
204d0 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
204e0 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
204f0 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74 63 68  ding.  ** xFetch
20500 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c   references. Or,
20510 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e   if p!=0 (meanin
20520 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63  g it is an xFetc
20530 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20  h reference),.  
20540 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  ** then there mu
20550 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
20560 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20  ne outstanding. 
20570 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
20580 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74  ==0)==(pFd->nFet
20590 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  chOut==0) );..  
205a0 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d  /* If p!=0, it m
205b0 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f  ust match the iO
205c0 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61  ff value. */.  a
205d0 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
205e0 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  ==&((u8 *)pFd->p
205f0 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
20600 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
20610 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
20620 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
20630 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22  et=%lld, p=%p\n"
20640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
20650 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
20660 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66 66 2c  Id(), pFd, iOff,
20670 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70 20 29   p));..  if( p )
20680 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
20690 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
206a0 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20  .    /* FIXME:  
206b0 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75 6c 79  If Windows truly
206c0 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e 74 73   always prevents
206d0 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20 64   truncating or d
206e0 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a  eleting a.    **
206f0 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20 6d 61   file while a ma
20700 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c 20 74  pping is held, t
20710 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
20720 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29  g winUnmapfile()
20730 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20   call.    ** is 
20740 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61 6e 20  unnecessary can 
20750 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d  can be omitted -
20760 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70   potentially imp
20770 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65  roving.    ** pe
20780 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20  rformance.  */. 
20790 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
207a0 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
207b0 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
207c0 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Out>=0 );.#endif
207d0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ..  OSTRACE(("UN
207e0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
207f0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
20800 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
20810 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20820 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
20830 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
20840 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20850 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
20860 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
20870 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
20880 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
20890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208a0 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
208b0 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
208c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
208e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
208f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
20930 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
20940 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
20950 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
20960 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a  n operate on an.
20970 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
20980 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74  for win32..*/.st
20990 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
209a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69  e3_io_methods wi
209b0 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  nIoMethod = {.  
209c0 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
209f0 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20   winClose,      
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
20a20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20  winRead,        
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69  /* xRead */.  wi
20a50 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  nWrite,         
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a70 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e   xWrite */.  win
20a80 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20aa0 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77  xTruncate */.  w
20ab0 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  inSync,         
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ad0 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e  * xSync */.  win
20ae0 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b00 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77  xFileSize */.  w
20b10 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  inLock,         
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20b30 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  * xLock */.  win
20b40 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b60 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  xUnlock */.  win
20b70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
20b80 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
20b90 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
20ba0 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43  ck */.  winFileC
20bb0 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
20bc0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
20bd0 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e  Control */.  win
20be0 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c00 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
20c10 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
20c20 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
20c30 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
20c40 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
20c50 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  winShmMap,      
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
20c80 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  winShmLock,     
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
20cb0 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20   winShmBarrier, 
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
20ce0 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70  */.  winShmUnmap
20cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20d00 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
20d10 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c  p */.  winFetch,
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
20d40 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68   */.  winUnfetch
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
20d70 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  h */.};../******
20d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20dc0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
20dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20de0 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
20df0 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
20e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e10 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
20e20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
20e30 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
20e40 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
20e50 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
20e60 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
20e70 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
20e80 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20  CYGWIN__)./*.** 
20e90 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61  Convert a filena
20ea0 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72  me from whatever
20eb0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
20ec0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
20ed0 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72  .** supports for
20ee0 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20   filenames into 
20ef0 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
20f00 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
20f10 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
20f20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
20f30 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
20f40 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
20f50 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
20f60 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72   char *winConver
20f70 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
20f80 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
20f90 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
20fa0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
20fb0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
20fc0 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
20fd0 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
20fe0 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  tf8(zFilename);.
20ff0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
21000 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
21010 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
21020 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
21030 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
21040 75 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  utf8(zFilename);
21050 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
21060 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
21070 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
21080 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
21090 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64  onverted;.}.#end
210a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
210b0 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61  t a UTF-8 filena
210c0 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  me into whatever
210d0 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c   form the underl
210e0 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e  ying.** operatin
210f0 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66  g system wants f
21100 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70  ilenames in.  Sp
21110 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
21120 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74  result.** is obt
21130 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
21140 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  c and must be fr
21150 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
21160 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
21170 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
21180 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
21190 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74  f8Filename(const
211a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
211b0 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  ){.  void *zConv
211c0 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
211d0 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
211e0 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
211f0 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
21200 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
21210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
21220 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
21230 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74  se{.    zConvert
21240 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  ed = sqlite3_win
21250 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
21260 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
21270 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c  #endif.  /* call
21280 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f  er will handle o
21290 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
212a0 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72    return zConver
212b0 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ted;.}../*.** Th
212c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
212d0 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
212e0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54  the specified UT
212f0 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65  F-8 string buffe
21300 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61  r.** ends with a
21310 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72   directory separ
21320 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f  ator character o
21330 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73  r one was succes
21340 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20  sfully.** added 
21350 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  to it..*/.static
21360 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49   int winMakeEndI
21370 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66  nDirSep(int nBuf
21380 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
21390 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20   if( zBuf ){.   
213a0 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69   int nLen = sqli
213b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
213c0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e  );.    if( nLen>
213d0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77  0 ){.      if( w
213e0 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b  inIsDirSep(zBuf[
213f0 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20  nLen-1]) ){.    
21400 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
21410 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c      }else if( nL
21420 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20  en+1<nBuf ){.   
21430 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20       zBuf[nLen] 
21440 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  = winGetDirSep()
21450 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e  ;.        zBuf[n
21460 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20  Len+1] = '\0';. 
21470 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
21480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21490 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
214a0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
214b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
214c0 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74  name and store t
214d0 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69  he resulting poi
214e0 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e  nter into pzBuf.
214f0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
21500 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75  returned in pzBu
21510 66 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  f must be freed 
21520 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65  via sqlite3_free
21530 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
21540 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65  t winGetTempname
21550 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
21560 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66  fs, char **pzBuf
21570 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
21580 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
21590 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
215a0 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
215b0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
215c0 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
215d0 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
215e0 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20    size_t i, j;. 
215f0 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69   int nPre = sqli
21600 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49  te3Strlen30(SQLI
21610 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
21620 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78  FIX);.  int nMax
21630 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c  , nBuf, nDir, nL
21640 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  en;.  char *zBuf
21650 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
21660 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
21670 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
21680 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
21690 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
216a0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
216b0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
216c0 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
216d0 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
216e0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
216f0 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  ling..  */.  Sim
21700 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
21710 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21720 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  R );..  /* Alloc
21730 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
21740 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
21750 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  the fully qualif
21760 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61  ied file.  ** na
21770 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  me for the tempo
21780 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74  rary file.  If t
21790 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61  his fails, we ca
217a0 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20  nnot continue.. 
217b0 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66   */.  nMax = pVf
217c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e  s->mxPathname; n
217d0 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a  Buf = nMax + 2;.
217e0 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33    zBuf = sqlite3
217f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66  MallocZero( nBuf
21800 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20   );.  if( !zBuf 
21810 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
21820 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
21830 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
21840 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72  OMEM\n"));.    r
21850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21860 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  RR_NOMEM;.  }.. 
21870 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
21880 68 65 20 65 66 66 65 63 74 69 76 65 20 74 65 6d  he effective tem
21890 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
218a0 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63 6b 20  .  First, check 
218b0 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61 73 20  if one.  ** has 
218c0 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c 79 20  been explicitly 
218d0 73 65 74 20 62 79 20 74 68 65 20 61 70 70 6c 69  set by the appli
218e0 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77 69 73  cation; otherwis
218f0 65 2c 20 75 73 65 20 74 68 65 20 6f 6e 65 0a 20  e, use the one. 
21900 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62   ** configured b
21910 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  y the operating 
21920 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e  system..  */.  n
21930 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28 6e 50  Dir = nMax - (nP
21940 72 65 20 2b 20 31 35 29 3b 0a 20 20 61 73 73 65  re + 15);.  asse
21950 72 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a 20 20  rt( nDir>0 );.  
21960 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  if( sqlite3_temp
21970 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
21980 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20 3d 20    int nDirLen = 
21990 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
219a0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
219b0 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 69 66 28  ectory);.    if(
219c0 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a 20 20   nDirLen>0 ){.  
219d0 20 20 20 20 69 66 28 20 21 77 69 6e 49 73 44 69      if( !winIsDi
219e0 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74 65 6d  rSep(sqlite3_tem
219f0 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44 69 72  p_directory[nDir
21a00 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
21a10 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20     nDirLen++;.  
21a20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21a30 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a  nDirLen>nDir ){.
21a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21a50 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
21a60 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
21a70 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
21a80 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
21a90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21aa0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
21ab0 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20 22 77  ITE_ERROR, 0, "w
21ac0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31 22 2c  inGetTempname1",
21ad0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
21ae0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21af0 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
21b00 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65  "%s", sqlite3_te
21b10 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
21b20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66     }.  }.#if def
21b30 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
21b40 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61  .  else{.    sta
21b50 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
21b60 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20  azDirs[] = {.   
21b70 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
21b80 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
21b90 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
21ba0 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  * getenv("TMPDIR
21bb0 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
21bc0 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 22 29  /* getenv("TMP")
21bd0 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a   */.       0, /*
21be0 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 20   getenv("TEMP") 
21bf0 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20  */.       0, /* 
21c00 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46  getenv("USERPROF
21c10 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  ILE") */.       
21c20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
21c30 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
21c40 20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20        "/tmp",.  
21c50 20 20 20 20 20 22 2e 22 2c 0a 20 20 20 20 20 20       ".",.      
21c60 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73   0        /* Lis
21c70 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
21c80 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73 69 67      };.    unsig
21c90 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 63  ned int i;.    c
21ca0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
21cb0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 21 61  = 0;..    if( !a
21cc0 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69 72  zDirs[0] ) azDir
21cd0 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[0] = getenv("S
21ce0 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
21cf0 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
21d00 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d  1] ) azDirs[1] =
21d10 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22   getenv("TMPDIR"
21d20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
21d30 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32  rs[2] ) azDirs[2
21d40 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 22  ] = getenv("TMP"
21d50 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69  );.    if( !azDi
21d60 72 73 5b 33 5d 20 29 20 61 7a 44 69 72 73 5b 33  rs[3] ) azDirs[3
21d70 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 45 4d 50  ] = getenv("TEMP
21d80 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
21d90 69 72 73 5b 34 5d 20 29 20 61 7a 44 69 72 73 5b  irs[4] ) azDirs[
21da0 34 5d 20 3d 20 67 65 74 65 6e 76 28 22 55 53 45  4] = getenv("USE
21db0 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20 20 20  RPROFILE");.    
21dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
21dd0 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
21de0 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69  (azDirs[0]); zDi
21df0 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a  r=azDirs[i++]){.
21e00 20 20 20 20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e        void *zCon
21e10 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20 69 66  verted;.      if
21e20 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74  ( zDir==0 ) cont
21e30 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a 20 49  inue;.      /* I
21e40 66 20 74 68 65 20 70 61 74 68 20 73 74 61 72 74  f the path start
21e50 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c  s with a drive l
21e60 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  etter followed b
21e70 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20 20 20  y the colon.    
21e80 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20    ** character, 
21e90 61 73 73 75 6d 65 20 69 74 20 69 73 20 61 6c 72  assume it is alr
21ea0 65 61 64 79 20 61 20 6e 61 74 69 76 65 20 57 69  eady a native Wi
21eb0 6e 33 32 20 70 61 74 68 3b 20 6f 74 68 65 72 77  n32 path; otherw
21ec0 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 69 74  ise,.      ** it
21ed0 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65 72 74   must be convert
21ee0 65 64 20 74 6f 20 61 20 6e 61 74 69 76 65 20 57  ed to a native W
21ef0 69 6e 33 32 20 70 61 74 68 20 76 69 61 20 74 68  in32 path via th
21f00 65 20 43 79 67 77 69 6e 20 41 50 49 0a 20 20 20  e Cygwin API.   
21f10 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 75     ** prior to u
21f20 73 69 6e 67 20 69 74 2e 0a 20 20 20 20 20 20 2a  sing it..      *
21f30 2f 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49  /.      if( winI
21f40 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
21f50 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a 20 20  olon(zDir) ){.  
21f60 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64        zConverted
21f70 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
21f80 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 44  mUtf8Filename(zD
21f90 69 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ir);.        if(
21fa0 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a   !zConverted ){.
21fb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21fc0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
21fd0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
21fe0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
21ff0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22000 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
22010 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22020 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22040 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28     if( winIsDir(
22050 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
22060 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22070 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
22080 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72  zBuf, "%s", zDir
22090 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
220a0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
220b0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
220c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
220d0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
220e0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
220f0 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d);.      }else{
22100 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72  .        zConver
22110 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ted = sqlite3Mal
22120 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20  locZero( nMax+1 
22130 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
22140 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20  zConverted ){.  
22150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22160 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
22170 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22180 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22190 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
221a0 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
221b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
221c0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
221d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
221e0 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76   if( cygwin_conv
221f0 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20 20  _path(.         
22200 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20         osIsNT() 
22210 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
22220 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
22230 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c  _TO_WIN_A, zDir,
22240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22250 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61   zConverted, nMa
22260 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  x+1)<0 ){.      
22270 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22280 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
222a0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
222b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
222c0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
222d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f  =SQLITE_IOERR_CO
222e0 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  NVPATH\n"));.   
222f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69         return wi
22300 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22310 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c  _IOERR_CONVPATH,
22320 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
22350 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a  GetTempname2", z
22360 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dir);.        }.
22370 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 49          if( winI
22380 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
22390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
223a0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
223b0 77 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64  we know the cand
223c0 69 64 61 74 65 20 64 69 72 65 63 74 6f 72 79 20  idate directory 
223d0 65 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c  exists and shoul
223e0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  d.          ** b
223f0 65 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72  e used.  However
22400 2c 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f  , we may need to
22410 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72   convert the str
22420 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  ing containing. 
22430 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
22440 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20  name into UTF-8 
22450 28 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55  (i.e. if it is U
22460 54 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29  TF-16 right now)
22470 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
22480 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
22490 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
224a0 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
224b0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
224c0 20 20 20 20 20 20 20 69 66 28 20 21 7a 55 74 66         if( !zUtf
224d0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  8 ){.           
224e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
224f0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
22500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22510 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
22520 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
22530 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
22540 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
22550 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
22560 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
22570 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22590 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
225a0 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
225b0 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  Buf, "%s", zUtf8
225c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
225d0 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
225e0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
225f0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
22600 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
22610 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
22620 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22630 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
22640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22650 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c 49  .  }.#elif !SQLI
22660 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
22670 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
22680 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 6f  __).  else if( o
22690 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63  sIsNT() ){.    c
226a0 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20  har *zMulti;.   
226b0 20 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61 74   LPWSTR zWidePat
226c0 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  h = sqlite3Mallo
226d0 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a 65  cZero( nMax*size
226e0 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 20  of(WCHAR) );.   
226f0 20 69 66 28 20 21 7a 57 69 64 65 50 61 74 68 20   if( !zWidePath 
22700 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22710 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22720 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
22730 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
22740 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22750 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
22760 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22770 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
22780 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50    if( osGetTempP
22790 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65  athW(nMax, zWide
227a0 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Path)==0 ){.    
227b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
227c0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
227d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
227e0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
227f0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
22800 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
22810 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e  RR_GETTEMPPATH\n
22820 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
22830 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
22840 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
22850 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  MPPATH, osGetLas
22860 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
22890 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  me2", 0);.    }.
228a0 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e      zMulti = win
228b0 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  UnicodeToUtf8(zW
228c0 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
228d0 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
228e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
228f0 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
22900 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %s", zMulti);.  
22910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22920 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20  (zMulti);.      
22930 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
22940 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c  dePath);.    }el
22950 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
22960 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
22970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
22980 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
22990 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
229a0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
229b0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
229c0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
229d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
229e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
229f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
22a00 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
22a10 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
22a20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
22a30 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71   *zMbcsPath = sq
22a40 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
22a50 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28   nMax );.    if(
22a60 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20   !zMbcsPath ){. 
22a70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22a80 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
22a90 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
22aa0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
22ab0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
22ac0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22ad0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
22ae0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EM;.    }.    if
22af0 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  ( osGetTempPathA
22b00 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68  (nMax, zMbcsPath
22b10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
22b20 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22b30 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22b40 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22b50 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22b60 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
22b70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
22b80 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
22b90 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
22ba0 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
22bb0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
22bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bd0 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33  "winGetTempname3
22be0 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
22bf0 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33   zUtf8 = sqlite3
22c00 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
22c10 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a  tf8(zMbcsPath);.
22c20 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
22c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
22c40 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
22c50 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
22c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22c70 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
22c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
22c90 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
22ca0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22cb0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22cc0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
22cd0 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
22ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22cf0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
22d00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
22d10 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
22d20 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66  S_ANSI */.#endif
22d30 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   /* !SQLITE_OS_W
22d40 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  INRT */..  /*.  
22d50 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ** Check to make
22d60 20 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72   sure the tempor
22d70 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e  ary directory en
22d80 64 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f  ds with an appro
22d90 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61  priate.  ** sepa
22da0 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f  rator.  If it do
22db0 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65  es not and there
22dc0 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73   is not enough s
22dd0 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64  pace left to add
22de0 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e  .  ** one, fail.
22df0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e  .  */.  if( !win
22e00 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28  MakeEndInDirSep(
22e10 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b  nDir+1, zBuf) ){
22e20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22e30 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
22e40 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
22e50 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
22e60 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
22e70 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
22e80 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
22e90 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
22ea0 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me4", 0);.  }.. 
22eb0 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74   /*.  ** Check t
22ec0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
22ed0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
22ee0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
22ef0 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a  mporary file.  *
22f00 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f  * name in the fo
22f10 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a  llowing format:.
22f20 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65    **.  **   "<te
22f30 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72  mporary_director
22f40 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58  y>/etilqs_XXXXXX
22f50 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20  XXXXXXXXX\0\0". 
22f60 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c   **.  ** If not,
22f70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22f80 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65  RROR.  The numbe
22f90 72 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72  r 17 is used her
22fa0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20  e in order to.  
22fb0 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74  ** account for t
22fc0 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
22fd0 20 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65   the 15 characte
22fe0 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20  r random suffix 
22ff0 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f  and the.  ** two
23000 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68   trailing NUL ch
23010 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66  aracters.  The f
23020 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73  inal directory s
23030 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
23040 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65  er.  ** has alre
23050 61 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20  ady added if it 
23060 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  was not already 
23070 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  present..  */.  
23080 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nLen = sqlite3St
23090 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20  rlen30(zBuf);.  
230a0 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65  if( (nLen + nPre
230b0 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b   + 17) > nBuf ){
230c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
230d0 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54  e(zBuf);.    OST
230e0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
230f0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45  NAME rc=SQLITE_E
23100 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72  RROR\n"));.    r
23110 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
23120 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
23130 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61  0, "winGetTempna
23140 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  me5", 0);.  }.. 
23150 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23160 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20  f(nBuf-16-nLen, 
23170 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54  zBuf+nLen, SQLIT
23180 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
23190 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69  IX);..  j = sqli
231a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
231b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
231c0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
231d0 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
231e0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
231f0 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
23200 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
23210 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
23220 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
23230 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
23240 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
23250 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
23260 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75  ;.  *pzBuf = zBu
23270 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  f;..  OSTRACE(("
23280 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61  TEMP-FILENAME na
23290 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
232a0 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a  _OK\n", zBuf));.
232b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
232c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
232d0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
232e0 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65  named file is re
232f0 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
23300 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20  .  Return false 
23310 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  if.** it is some
23320 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
23330 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72   a directory, or
23340 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
23350 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a   kind of memory.
23360 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ** allocation fa
23370 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
23380 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f   int winIsDir(co
23390 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  nst void *zConve
233a0 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61  rted){.  DWORD a
233b0 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
233c0 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
233d0 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49  rrno;..  if( osI
233e0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
233f0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
23400 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
23410 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
23420 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
23430 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
23440 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
23450 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
23460 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
23470 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
23480 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234a0 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
234b0 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
234c0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
234d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
234e0 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
234f0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
23500 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
23510 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20  ){}.    if( !rc 
23520 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
23530 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61  0; /* Invalid na
23540 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  me? */.    }.   
23550 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
23560 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
23570 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  es;.#if SQLITE_O
23580 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
23590 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
235a0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
235b0 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
235c0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
235d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74   }.  return (att
235e0 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
235f0 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
23600 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
23610 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a  UTE_DIRECTORY);.
23620 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
23630 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
23640 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
23650 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
23660 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ,        /* Used
23670 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20   to get maximum 
23680 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68  path name length
23690 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
236a0 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
236b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
236c0 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
236d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
236e0 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
236f0 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
23700 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
23710 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23730 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
23740 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
23750 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
23760 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
23770 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
23780 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
23790 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
237a0 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
237b0 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
237c0 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
237d0 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
237e0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
237f0 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
23800 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
23810 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
23820 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
23830 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
23840 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
23850 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
23860 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
23870 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23880 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
23890 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
238a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
238b0 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
238c0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
238d0 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
238e0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
238f0 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
23900 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
23910 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
23920 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
23930 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
23940 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
23950 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
23960 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
23970 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
23980 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61  /.  char *zTmpna
23990 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74  me = 0; /* For t
239a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
239b0 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  e, if necessary.
239c0 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20   */..  int rc = 
239d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
239e0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
239f0 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  n Return Code */
23a00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
23a10 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f  EBUG) || SQLITE_
23a20 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65  OS_WINCE.  int e
23a30 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
23a40 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
23a50 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
23a60 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69  n */.#endif..  i
23a70 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
23a80 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23a90 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
23aa0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
23ab0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
23ac0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23ad0 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
23ae0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
23af0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
23b00 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
23b10 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
23b20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
23b30 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
23b40 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
23b50 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
23b60 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
23b70 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e  EADWRITE);..#ifn
23b80 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
23b90 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d   isOpenJournal =
23ba0 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
23bb0 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
23bc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
23bd0 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c  R_JOURNAL.     |
23be0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
23bf0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
23c00 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  L.     || eType=
23c10 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
23c20 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  .  ));.#endif.. 
23c30 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
23c40 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25  name=%s, pFile=%
23c50 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75  p, flags=%x, pOu
23c60 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20  tFlags=%p\n",.  
23c70 20 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61           zUtf8Na
23c80 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70  me, id, flags, p
23c90 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f  OutFlags));..  /
23ca0 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
23cb0 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
23cc0 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a   are true:.  **.
23cd0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
23ce0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
23cf0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
23d00 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
23d10 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
23d20 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
23d30 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
23d40 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
23d50 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
23d60 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
23d70 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
23d80 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
23d90 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
23da0 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
23db0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
23dc0 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
23dd0 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
23de0 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
23df0 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
23e00 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
23e10 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
23e20 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
23e30 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
23e40 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
23e50 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
23e60 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
23e70 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
23e80 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
23e90 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
23ea0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
23eb0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
23ec0 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
23ed0 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
23ee0 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ever.  ** automa
23ef0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
23f00 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
23f10 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
23f20 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
23f30 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
23f40 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
23f50 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
23f60 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
23f70 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
23f80 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
23f90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
23fa0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
23fb0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
23fc0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
23fd0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
23fe0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
23ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
24000 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
24010 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
24020 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
24030 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
24040 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
24050 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
24060 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
24070 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
24080 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
24090 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
240a0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
240b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
240c0 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  DB.       || eTy
240d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
240e0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
240f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
24100 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a  EN_TEMP_JOURNAL.
24110 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
24120 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
24130 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
24140 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
24150 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20  MASTER_JOURNAL. 
24160 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
24170 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
24180 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
24190 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
241a0 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
241b0 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
241c0 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
241d0 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65  , sizeof(winFile
241e0 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ));.  pFile->h =
241f0 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
24200 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49  VALUE;..#if SQLI
24210 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
24220 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20  ( !zUtf8Name && 
24230 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  !sqlite3_temp_di
24240 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
24250 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
24260 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20  E_ERROR,.       
24270 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   "sqlite3_temp_d
24280 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c  irectory variabl
24290 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  e should be set 
242a0 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d  for WinRT");.  }
242b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
242c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
242d0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
242e0 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
242f0 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74  enerate a.  ** t
24300 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
24310 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20  me to use.  */. 
24320 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
24330 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
24340 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70  sDelete && !isOp
24350 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  enJournal );.   
24360 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
24370 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70  name(pVfs, &zTmp
24380 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
24390 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
243a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
243b0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
243c0 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  =%s", zUtf8Name,
243d0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
243e0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
243f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24400 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54    zUtf8Name = zT
24410 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f  mpname;.  }..  /
24420 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
24430 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
24440 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
24450 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
24460 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
24470 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
24480 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
24490 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
244a0 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75  o.  ** sqlite3_u
244b0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a  ri_parameter()..
244c0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
244d0 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
244e0 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28  EN_MAIN_DB) || (
244f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24500 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20  PEN_URI) ||.    
24510 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c     zUtf8Name[sql
24520 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74  ite3Strlen30(zUt
24530 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  f8Name)+1]==0 );
24540 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
24550 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74  he filename to t
24560 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69  he system encodi
24570 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72  ng. */.  zConver
24580 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
24590 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
245a0 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
245b0 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
245c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
245d0 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
245e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
245f0 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  EN name=%s, rc=S
24600 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24610 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  M", zUtf8Name));
24620 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24630 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
24640 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73    }..  if( winIs
24650 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
24660 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24670 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
24680 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24690 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
246a0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
246b0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
246c0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
246d0 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  R", zUtf8Name));
246e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
246f0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
24700 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  R;.  }..  if( is
24710 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
24720 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
24730 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
24740 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
24750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
24760 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
24770 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
24780 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  }..  /* SQLITE_O
24790 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
247a0 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
247b0 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
247c0 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74  le is.  ** creat
247d0 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
247e0 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
247f0 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
24800 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73   access".  ** as
24810 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
24820 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
24830 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
24840 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  e ){.    /* Crea
24850 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
24860 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
24870 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
24880 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
24890 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
248a0 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
248b0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
248c0 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
248d0 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
248e0 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
248f0 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
24900 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
24910 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
24920 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
24930 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24940 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
24950 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
24960 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
24970 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
24980 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
24990 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
249a0 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
249b0 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65  ;.  }..  dwShare
249c0 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
249d0 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
249e0 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66  ARE_WRITE;..  if
249f0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
24a00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
24a10 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
24a20 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
24a30 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
24a40 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
24a50 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
24a60 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
24a70 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
24a80 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
24ab0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
24ac0 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
24af0 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
24b00 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
24b10 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
24b20 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
24b30 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
24b40 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
24b50 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
24b60 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
24b70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
24b80 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
24b90 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
24ba0 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
24bb0 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
24bc0 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
24bd0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
24be0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24bf0 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
24c00 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
24c10 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73  ndif..  if( osIs
24c20 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
24c30 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
24c40 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
24c50 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20  NDED_PARAMETERS 
24c60 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
24c70 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  rs;.    extended
24c80 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a  Parameters.dwSiz
24c90 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54  e = sizeof(CREAT
24ca0 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
24cb0 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20  PARAMETERS);.   
24cc0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
24cd0 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ers.dwFileAttrib
24ce0 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20  utes =.         
24cf0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
24d00 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41  ributes & FILE_A
24d10 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20  TTRIBUTE_MASK;. 
24d20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
24d30 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67  eters.dwFileFlag
24d40 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74  s = dwFlagsAndAt
24d50 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
24d60 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  FLAG_MASK;.    e
24d70 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24d80 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46  s.dwSecurityQosF
24d90 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f  lags = SECURITY_
24da0 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65  ANONYMOUS;.    e
24db0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
24dc0 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72  s.lpSecurityAttr
24dd0 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  ibutes = NULL;. 
24de0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
24df0 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46  eters.hTemplateF
24e00 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile = NULL;.    
24e10 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
24e20 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53  eateFile2((LPCWS
24e30 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
24e40 20 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 64 77 44               dwD
24e60 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
24e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e80 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
24e90 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20  areMode,.       
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
24ec0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74              &ext
24ef0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29  endedParameters)
24f00 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
24f10 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f30 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72           winRetr
24f40 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
24f50 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
24f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
24f70 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73  op */.    }.#els
24f80 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  e.    while( (h 
24f90 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28  = osCreateFileW(
24fa0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
24fb0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
24fe0 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25000 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e    dwShareMode, N
25010 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
25040 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25060 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
25070 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
25080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25090 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
250a0 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
250b0 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250d0 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65 74            winRet
250e0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
250f0 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
25100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25110 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  oop */.    }.#en
25120 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
25130 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
25140 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
25150 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
25160 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53  reateFileA((LPCS
25170 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
25180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
251a0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
251d0 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
25200 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
25210 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
25220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25230 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
25240 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
25270 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25280 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72      winRetryIoer
252b0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
252c0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
252d0 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f        /* Noop */
252e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
252f0 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28  f.  winLogIoerr(
25300 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  cnt);..  OSTRACE
25310 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
25320 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
25330 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  =%lx, rc=%s\n", 
25340 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20  h, zUtf8Name,.  
25350 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
25360 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e  edAccess, (h==IN
25370 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
25380 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a  UE) ? "failed" :
25390 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20   "ok"));..  if( 
253a0 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
253b0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70  E_VALUE ){.    p
253c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
253d0 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
253e0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
253f0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46  ITE_CANTOPEN, pF
25400 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
25410 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38  "winOpen", zUtf8
25420 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
25430 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25440 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
25450 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
25460 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
25470 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
25480 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65  sive ){.      re
25490 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66  turn winOpen(pVf
254a0 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20  s, zName, id,.  
254b0 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53         ((flags|S
254c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
254d0 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20  NLY) &.         
254e0 20 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51              ~(SQ
254f0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
25500 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
25510 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20  DWRITE)),.      
25520 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20     pOutFlags);. 
25530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
25550 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
25560 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f   }.  }..  if( pO
25570 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69  utFlags ){.    i
25580 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
25590 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61  {.      *pOutFla
255a0 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
255b0 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
255c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f  }else{.      *pO
255d0 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  utFlags = SQLITE
255e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
255f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54      }.  }..  OST
25600 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65  RACE(("OPEN file
25610 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63  =%p, name=%s, ac
25620 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c  cess=%lx, pOutFl
25630 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61  ags=%p, *pOutFla
25640 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20  gs=%d, ".       
25650 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68      "rc=%s\n", h
25660 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44  , zUtf8Name, dwD
25670 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f  esiredAccess, pO
25680 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  utFlags, pOutFla
25690 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  gs ?.           
256a0 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20  *pOutFlags : 0, 
256b0 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  (h==INVALID_HAND
256c0 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69  LE_VALUE) ? "fai
256d0 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
256e0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
256f0 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64  NCE.  if( isRead
25700 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
25710 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25720 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 28 72  _DB.       && (r
25730 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c  c = winceCreateL
25740 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65  ock(zName, pFile
25750 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))!=SQLITE_OK.  
25760 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  ){.    osCloseHa
25770 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c  ndle(h);.    sql
25780 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
25790 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  rted);.    sqlit
257a0 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
257b0 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
257c0 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61  "OPEN-CE-LOCK na
257d0 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c  me=%s, rc=%s\n",
257e0 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45   zName, sqlite3E
257f0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
25800 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
25810 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
25820 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
25830 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
25840 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
25850 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
25860 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
25870 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20  nverted);.  }.. 
25880 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
25890 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  mpname);.  pFile
258a0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e  ->pMethod = &win
258b0 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c  IoMethod;.  pFil
258c0 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  e->pVfs = pVfs;.
258d0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
258e0 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
258f0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
25900 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
25910 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  ILE_RDONLY;.  }.
25920 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
25930 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
25940 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
25950 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
25960 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ITE) ){.    pFil
25970 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
25980 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  WINFILE_PSOW;.  
25990 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  }.  pFile->lastE
259a0 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
259b0 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
259c0 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c  = zName;.#if SQL
259d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
259e0 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61  E>0.  pFile->hMa
259f0 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c  p = NULL;.  pFil
25a00 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
25a10 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
25a20 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c  Size = 0;.  pFil
25a30 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
25a40 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e  l = 0;.  pFile->
25a50 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71  mmapSizeMax = sq
25a60 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
25a70 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66  g.szMmap;.#endif
25a80 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ..  OpenCounter(
25a90 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  +1);.  return rc
25aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
25ab0 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
25ac0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
25ad0 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  t Windows does n
25ae0 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20  ot allow a file 
25af0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66  to be deleted if
25b00 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
25b10 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70  rocess has it op
25b20 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61  en.  Sometimes a
25b30 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f   virus scanner o
25b40 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72  r indexing progr
25b50 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20  am.** will open 
25b60 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  a journal file s
25b70 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20  hortly after it 
25b80 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
25b90 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61  der to do.** wha
25ba0 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20  tever it does.  
25bb0 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72  While this other
25bc0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
25bd0 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
25be0 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65  open, we will be
25bf0 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74   unable to delet
25c00 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61  e it.  To work a
25c10 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72  round this.** pr
25c20 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20  oblem, we delay 
25c30 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
25c40 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65   and try to dele
25c50 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a  te again.  Up.**
25c60 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f   to MX_DELETION_
25c70 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f  ATTEMPTs deletio
25c80 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72  n attempts are r
25c90 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  un before giving
25ca0 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72  .** up and retur
25cb0 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
25cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
25cd0 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
25ce0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
25cf0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
25d00 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
25d10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
25d20 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
25d30 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
25d40 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73  elete */.  int s
25d50 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20  yncDir          
25d60 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
25d70 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29  ed on win32 */.)
25d80 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
25d90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f  .  int rc;.  DWO
25da0 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44  RD attr;.  DWORD
25db0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
25dc0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
25dd0 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
25de0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
25df0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
25e00 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69  (syncDir);..  Si
25e10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
25e20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
25e30 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54  R_DELETE);.  OST
25e40 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
25e50 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25  me=%s, syncDir=%
25e60 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  d\n", zFilename,
25e70 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a   syncDir));..  z
25e80 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43  Converted = winC
25e90 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69  onvertFromUtf8Fi
25ea0 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65  lename(zFilename
25eb0 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
25ec0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ted==0 ){.    OS
25ed0 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e  TRACE(("DELETE n
25ee0 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54  ame=%s, rc=SQLIT
25ef0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
25f00 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
25f10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25f20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
25f30 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
25f40 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66   ){.    do {.#if
25f50 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
25f60 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  .      WIN32_FIL
25f70 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
25f80 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
25f90 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
25fa0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
25fb0 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
25fc0 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65    if ( osGetFile
25fd0 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43  AttributesExW(zC
25fe0 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c  onverted, GetFil
25ff0 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
26000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26020 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29     &sAttrData) )
26030 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
26040 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
26050 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
26060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26070 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
26080 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
26090 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
260a0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
260b0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
260c0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
260d0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
260e0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
260f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26100 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
26110 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
26120 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
26130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26140 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26150 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
26160 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26170 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
26180 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
26190 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
261a0 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
261b0 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  f.      if ( att
261c0 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
261d0 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
261e0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
261f0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
26200 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
26210 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
26220 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
26230 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
26240 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
26250 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
26260 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26270 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
26280 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
26290 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
262a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
262b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
262c0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
262d0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
262e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
262f0 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
26300 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
26310 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
26320 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
26330 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
26340 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
26350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26360 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
26370 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eW(zConverted) )
26380 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
26390 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
263a0 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
263b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
263c0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
263d0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
263e0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
263f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
26400 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
26410 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
26420 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
26430 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26440 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
26450 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
26460 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
26470 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
26480 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
26490 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
264a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
264b0 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
264c0 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
264d0 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
264e0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
264f0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
26500 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
26510 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
26520 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
26530 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
26540 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
26550 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
26560 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
26570 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
26580 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
26590 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
265a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
265b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
265c0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
265d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
265e0 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
265f0 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
26600 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
26610 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26620 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
26630 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
26640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
26650 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
26660 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
26670 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
26680 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26690 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
266a0 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
266b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
266c0 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
266d0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
266e0 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
266f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26700 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
26710 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
26720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26730 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
26740 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
26750 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
26760 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
26770 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  ETE_NOENT ){.   
26780 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
26790 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
267a0 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
267b0 2c 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a  , "winDelete", z
267c0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
267d0 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
267e0 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20  err(cnt);.  }.  
267f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
26800 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
26810 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
26820 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
26830 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
26840 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
26850 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26860 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
26870 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73   existence and s
26880 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e  tatus of a file.
26890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
268a0 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  inAccess(.  sqli
268b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
268c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
268d0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
268e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
268f0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  lename,     /* N
26900 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63  ame of file to c
26910 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  heck */.  int fl
26920 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
26930 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
26940 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
26950 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
26960 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
26970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26980 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20  : Result */.){. 
26990 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
269a0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
269b0 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
269c0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
269d0 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
269e0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
269f0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
26a00 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
26a10 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
26a20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  );.  OSTRACE(("A
26a30 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66  CCESS name=%s, f
26a40 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74  lags=%x, pResOut
26a50 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
26a60 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c     zFilename, fl
26a70 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ags, pResOut));.
26a80 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
26a90 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
26aa0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
26ab0 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
26ac0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
26ad0 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
26ae0 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  SS name=%s, rc=S
26af0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
26b00 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  M\n", zFilename)
26b10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
26b20 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
26b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
26b40 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
26b50 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
26b60 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
26b70 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
26b80 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
26b90 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
26ba0 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
26bb0 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
26bc0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
26bd0 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
26be0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
26bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c00 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
26c10 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
26c20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
26c40 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
26c50 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
26c60 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
26c70 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  {}.    if( rc ){
26c80 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e  .      /* For an
26c90 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
26ca0 58 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65  XISTS query, tre
26cb0 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  at a zero-length
26cc0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
26cd0 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  s if it does not
26ce0 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
26cf0 0a 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c  .      if(    fl
26d00 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
26d10 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20  SS_EXISTS.      
26d20 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
26d30 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d  .nFileSizeHigh==
26d40 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  0.          && s
26d50 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69  AttrData.nFileSi
26d60 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20  zeLow==0 ){.    
26d70 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
26d80 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
26d90 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ES;.      }else{
26da0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
26db0 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
26dc0 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20  Attributes;.    
26dd0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
26de0 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72       winLogIoerr
26df0 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (cnt);.      if(
26e00 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
26e10 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
26e20 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
26e30 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
26e40 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  UND ){.        s
26e50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
26e60 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
26e70 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
26e80 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
26e90 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
26ea0 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
26eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
26ed0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
26ee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
26ef0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
26f00 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
26f10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
26f20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
26f30 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
26f40 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
26f50 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
26f60 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
26f70 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
26f80 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
26f90 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
26fa0 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
26fb0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
26fc0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
26fd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
26fe0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
26ff0 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
27000 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
27010 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72  IBUTES;.      br
27020 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
27030 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
27040 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20  WRITE:.      rc 
27050 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
27060 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
27070 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
27080 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  (attr & FILE_ATT
27090 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29  RIBUTE_READONLY)
270a0 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ==0;.      break
270b0 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
270c0 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
270d0 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
270e0 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
270f0 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f  ResOut = rc;.  O
27100 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
27110 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74  name=%s, pResOut
27120 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64  =%p, *pResOut=%d
27130 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
27140 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46  ",.           zF
27150 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74  ilename, pResOut
27160 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
27170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
27190 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
271a0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
271b0 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
271c0 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
271d0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79  r.** followed by
271e0 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74   a colon charact
271f0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  er..*/.static BO
27200 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  OL winIsDriveLet
27210 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63  terAndColon(.  c
27220 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
27230 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e  name.){.  return
27240 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68   ( sqlite3Isalph
27250 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  a(zPathname[0]) 
27260 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d  && zPathname[1]=
27270 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  =':' );.}../*.**
27280 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
27290 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
272a0 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  ed path name sho
272b0 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62  uld be used verb
272c0 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e  atim.  If.** non
272d0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
272e0 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  d from this func
272f0 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e  tion, the callin
27300 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
27310 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68  simply.** use th
27320 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20  e provided path 
27330 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f  name verbatim -O
27340 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e  R- resolve it in
27350 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e  to a full path n
27360 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ame.** using the
27370 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
27380 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74   Win32 API funct
27390 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c  ion (if availabl
273a0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  e)..*/.static BO
273b0 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d  OL winIsVerbatim
273c0 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
273d0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
273e0 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  e.){.  /*.  ** I
273f0 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
27400 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f  starts with a fo
27410 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61  rward slash or a
27420 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69   backslash, it i
27430 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20  s either.  ** a 
27440 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20  legal UNC name, 
27450 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  a volume relativ
27460 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62  e path, or an ab
27470 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65  solute path name
27480 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e   in the.  ** "Un
27490 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69  ix" format on Wi
274a0 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73  ndows.  There is
274b0 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20   no easy way to 
274c0 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
274d0 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66  tween.  ** the f
274e0 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20  inal two cases; 
274f0 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65  therefore, we re
27500 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72  turn the safer r
27510 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
27520 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  RUE.  ** so that
27530 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   callers of this
27540 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
27550 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72  imply use it ver
27560 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  batim..  */.  if
27570 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a   ( winIsDirSep(z
27580 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a  Pathname[0]) ){.
27590 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
275a0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
275b0 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
275c0 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c   starts with a l
275d0 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f  etter and a colo
275e0 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61  n it is either a
275f0 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c   volume.  ** rel
27600 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e  ative path or an
27610 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20   absolute path. 
27620 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   Callers of this
27630 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e   function must n
27640 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20  ot.  ** attempt 
27650 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61  to treat it as a
27660 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
27670 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73  ame (i.e. they s
27680 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65  hould simply use
27690 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69  .  ** it verbati
276a0 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  m)..  */.  if ( 
276b0 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
276c0 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61  AndColon(zPathna
276d0 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  me) ){.    retur
276e0 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
276f0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74  *.  ** If we get
27700 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
27710 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68  the path name sh
27720 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74  ould almost cert
27730 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c  ainly be a purel
27740 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  y.  ** relative 
27750 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20  one (i.e. not a 
27760 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62  UNC name, not ab
27770 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20  solute, and not 
27780 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29  volume relative)
27790 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
277a0 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FALSE;.}../*.** 
277b0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
277c0 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
277d0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
277e0 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
277f0 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
27800 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
27810 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
27820 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27830 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
27840 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
27850 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
27860 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
27870 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
27880 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
27890 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
278a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
278b0 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
278c0 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
278d0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
278e0 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
27910 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
27920 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
27930 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
27940 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
27950 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23   buffer */.){..#
27960 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
27970 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
27980 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
27990 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
279a0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
279b0 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
279c0 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
279d0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
279e0 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
279f0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
27a00 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
27a10 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
27a20 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
27a30 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
27a40 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
27a50 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
27a60 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
27a70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
27a80 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
27a90 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
27aa0 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
27ab0 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
27ac0 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
27ad0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
27ae0 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
27af0 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
27b00 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
27b10 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
27b20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
27b30 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
27b40 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
27b50 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
27b60 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
27b70 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
27b80 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
27b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27ba0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
27bb0 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
27bc0 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
27bd0 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
27be0 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
27bf0 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
27c00 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20  _TO_WIN_A) |.   
27c10 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c           CCP_REL
27c20 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
27c30 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
27c40 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
27c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
27c60 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
27c70 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
27c80 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
27c90 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
27ca0 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
27cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cc0 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
27cd0 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
27ce0 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
27cf0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
27d00 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
27d10 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
27d20 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
27d30 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
27d40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
27d50 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
27d60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27d70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
27d80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
27d90 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
27da0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
27db0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
27dc0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
27de0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
27df0 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
27e00 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  (), zUtf8);.    
27e10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27e20 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
27e30 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
27e40 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
27e50 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
27e60 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
27e70 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
27e80 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
27e90 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
27ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
27eb0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
27ec0 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
27ed0 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
27ee0 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
27ef0 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
27f00 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
27f10 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20  IX_TO_WIN_A),.  
27f20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
27f30 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
27f40 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
27f50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27f60 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
27f70 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
27f80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
27f90 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
27fa0 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
27fd0 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
27fe0 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
27ff0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
28000 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
28010 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
28020 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
28030 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
28040 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28050 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
28060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
28070 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
28080 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
28090 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
280a0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
280b0 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
280c0 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
280d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
280e0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
280f0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
28100 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
28120 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
28130 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
28140 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20  QLITE_OS_WINRT) 
28150 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
28160 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
28170 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
28180 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
28190 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
281a0 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
281b0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
281c0 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
281d0 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e  old. */.  /* Win
281e0 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f  RT has no way to
281f0 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74   convert a relat
28200 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61  ive path to an a
28210 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a  bsolute one. */.
28220 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
28230 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
28240 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
28250 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
28260 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
28270 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
28280 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
28290 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
282a0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
282b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
282c0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
282d0 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
282e0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
282f0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
28300 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
28310 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
28320 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
28330 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
28340 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
28350 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
28360 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
28370 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
28380 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
28390 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
283a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
283b0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
283c0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
283d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
283e0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
283f0 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
28400 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
28410 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
28420 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
28430 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
28440 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
28450 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
28460 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
28480 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
28490 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
284a0 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
284b0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
284c0 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
284d0 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
284e0 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
284f0 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
28500 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67  is path name beg
28510 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20  ins with "/X:", 
28520 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79  where "X" is any
28530 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a   alphabetic.  **
28540 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63   character, disc
28550 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ard the initial 
28560 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74  "/" from the pat
28570 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hname..  */.  if
28580 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
28590 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76  '/' && winIsDriv
285a0 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
285b0 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a  zRelative+1) ){.
285c0 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
285d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
285e0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
285f0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
28600 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
28610 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
28620 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
28630 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
28640 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
28650 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
28660 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
28670 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
28680 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
28690 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
286a0 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
286b0 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
286c0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
286d0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
286e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
286f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
28700 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
28710 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
28720 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
28730 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
28740 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
28750 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
28760 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
28770 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
28780 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
28790 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
287a0 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
287b0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
287c0 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
287d0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
287e0 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
287f0 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
28800 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
28810 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
28820 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
28830 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
28840 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
28850 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
28860 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
28870 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
28880 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
28890 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
288a0 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
288b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288c0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
288d0 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
288e0 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
288f0 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
28900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28910 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
28920 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
28930 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
28940 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
28950 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
28960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28970 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
28980 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
28990 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  {.    LPWSTR zTe
289a0 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
289b0 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
289c0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
289d0 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
289e0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
289f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
28a00 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
28a10 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
28a20 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
28a30 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
28a40 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
28a50 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
28a80 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
28a90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
28aa0 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
28ab0 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
28ac0 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
28ad0 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
28ae0 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
28af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
28b00 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28b10 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
28b20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28b30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
28b40 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
28b50 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
28b60 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28b70 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
28b80 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
28b90 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
28ba0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28bb0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
28bc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
28bd0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28be0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
28bf0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
28c00 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
28c10 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
28c40 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e2", zRelative);
28c50 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
28c60 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28c70 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
28c80 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
28c90 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
28ca0 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
28cb0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
28cc0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
28cd0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
28ce0 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
28cf0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
28d00 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
28d10 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
28d20 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
28d30 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
28d40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28d50 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28d60 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
28d70 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
28d80 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
28d90 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
28da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28db0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
28dc0 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52  llPathname3", zR
28dd0 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
28de0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
28df0 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
28e00 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
28e10 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
28e20 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
28e30 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
28e40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28e50 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
28e60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28e70 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
28e80 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
28e90 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
28ea0 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
28eb0 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
28ec0 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
28ed0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
28ee0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28ef0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
28f00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
28f10 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
28f20 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28f30 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
28f40 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
28f50 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
28f80 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69  hname4", zRelati
28f90 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
28fa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28fb0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
28fc0 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
28fd0 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
28fe0 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
28ff0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
29000 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
29010 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
29020 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
29030 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
29040 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
29050 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
29060 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29070 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
29080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29090 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
290a0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
290b0 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
290c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
290d0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
290e0 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
290f0 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
29100 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
29110 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
29120 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
29130 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
29140 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
29150 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
29160 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
29170 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
29180 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
29190 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
291a0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
291b0 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65  HANDLE h;.#if de
291c0 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
291d0 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20  ).  int nFull = 
291e0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
291f0 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  +1;.  char *zFul
29200 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
29210 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a  cZero( nFull );.
29220 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
29230 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ed = 0;.  if( zF
29240 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ull==0 ){.    OS
29250 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
29260 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
29270 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
29280 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
29290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
292a0 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68   if( winFullPath
292b0 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
292c0 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75  name, nFull, zFu
292d0 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ll)!=SQLITE_OK )
292e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
292f0 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f  ee(zFull);.    O
29300 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
29310 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
29320 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
29330 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
29340 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
29350 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
29360 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
29370 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29  8Filename(zFull)
29380 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
29390 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20  (zFull);.#else. 
293a0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
293b0 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
293c0 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
293d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
293e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
293f0 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  fs);.#endif.  if
29400 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
29410 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
29420 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
29430 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
29440 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
29450 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
29460 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
29470 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
29480 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
29490 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
294a0 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
294b0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
294c0 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
294d0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
294e0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
294f0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
29500 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
29510 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
29520 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
29530 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
29540 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
29550 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
29560 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
29570 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
29580 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
29590 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20  e, (void*)h));. 
295a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
295b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
295c0 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
295d0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
295e0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
295f0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
29600 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
29610 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
29620 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
29630 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
29640 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
29650 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
29660 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
29670 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
29680 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
29690 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
296a0 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
296b0 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f  ){.  FARPROC pro
296c0 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
296d0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70  METER(pVfs);.  p
296e0 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41  roc = osGetProcA
296f0 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
29700 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54  pH, zSym);.  OST
29710 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e  RACE(("DLSYM han
29720 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25  dle=%p, symbol=%
29730 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22  s, address=%p\n"
29740 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
29750 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76  id*)pH, zSym, (v
29760 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72  oid*)proc));.  r
29770 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
29780 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61  oid))proc;.}.sta
29790 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
297a0 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
297b0 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
297c0 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
297d0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
297e0 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
297f0 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
29800 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
29810 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70  LCLOSE handle=%p
29820 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e  \n", (void*)pHan
29830 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  dle));.}.#else /
29840 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
29850 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
29860 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
29870 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
29880 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
29890 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
298a0 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
298b0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
298c0 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
298d0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
298e0 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
298f0 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
29900 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
29910 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
29920 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
29930 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
29940 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
29950 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
29960 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29970 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
29980 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
29990 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65    n = nBuf;.  me
299a0 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
299b0 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
299c0 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49   sizeof(SYSTEMTI
299d0 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ME)<=nBuf-n ){. 
299e0 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
299f0 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
29a00 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65  Time(&x);.    me
29a10 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
29a20 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
29a30 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78     n += sizeof(x
29a40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a  );.  }.  if( siz
29a50 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66  eof(DWORD)<=nBuf
29a60 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20  -n ){.    DWORD 
29a70 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65  pid = osGetCurre
29a80 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20  ntProcessId();. 
29a90 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
29aa0 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66  n], &pid, sizeof
29ab0 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (pid));.    n +=
29ac0 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20   sizeof(pid);.  
29ad0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  }.#if SQLITE_OS_
29ae0 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65  WINRT.  if( size
29af0 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e  of(ULONGLONG)<=n
29b00 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f  Buf-n ){.    ULO
29b10 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47  NGLONG cnt = osG
29b20 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b  etTickCount64();
29b30 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
29b40 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
29b50 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
29b60 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
29b70 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
29b80 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
29b90 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
29ba0 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  RD cnt = osGetTi
29bb0 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d  ckCount();.    m
29bc0 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
29bd0 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
29be0 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
29bf0 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
29c00 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f  ndif.  if( sizeo
29c10 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29  f(LARGE_INTEGER)
29c20 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
29c30 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b  LARGE_INTEGER i;
29c40 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72 66  .    osQueryPerf
29c50 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26  ormanceCounter(&
29c60 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  i);.    memcpy(&
29c70 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a  zBuf[n], &i, siz
29c80 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(i));.    n +
29c90 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d  = sizeof(i);.  }
29ca0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
29cb0 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   n;.}.../*.** Sl
29cc0 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
29cd0 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
29ce0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
29cf0 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
29d00 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
29d10 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
29d20 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
29d30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  ){.  sqlite3_win
29d40 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73  32_sleep((micros
29d50 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ec+999)/1000);. 
29d60 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29d70 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
29d80 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
29d90 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
29da0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
29db0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
29dc0 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
29dd0 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
29de0 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
29df0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
29e00 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
29e10 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
29e20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
29e30 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
29e40 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
29e50 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
29e60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
29e70 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
29e80 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
29e90 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
29ea0 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
29eb0 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
29ec0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
29ed0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
29ee0 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
29ef0 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
29f00 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
29f10 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
29f20 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
29f30 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
29f40 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
29f50 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
29f60 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
29f70 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
29f80 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
29f90 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
29fa0 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
29fb0 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
29fc0 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
29fd0 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
29fe0 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
29ff0 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
2a000 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
2a010 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
2a020 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
2a030 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
2a040 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2a050 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2a060 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20   date.** cannot 
2a070 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2a080 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2a090 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2a0a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
2a0b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
2a0c0 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
2a0d0 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
2a0e0 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
2a0f0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
2a100 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
2a110 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
2a120 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
2a130 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
2a140 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
2a150 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
2a160 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
2a170 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2a180 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
2a190 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
2a1a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2a1b0 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
2a1c0 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
2a1d0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2a1e0 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2a1f0 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2a200 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2a210 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
2a220 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
2a230 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
2a240 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
2a250 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2a260 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
2a270 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20  32BitValue =.   
2a280 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
2a290 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
2a2a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
2a2b0 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
2a2c0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2a2d0 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
2a2e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
2a2f0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
2a300 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
2a310 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
2a320 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
2a330 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
2a340 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
2a350 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
2a360 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
2a370 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
2a380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2a390 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
2a3a0 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
2a3b0 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
2a3c0 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
2a3d0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
2a3e0 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
2a3f0 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
2a400 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
2a410 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
2a420 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
2a430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a440 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
2a450 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
2a460 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
2a470 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
2a480 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
2a490 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2a4a0 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
2a4b0 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
2a4c0 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
2a4d0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
2a4e0 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
2a4f0 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
2a500 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2a510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2a520 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
2a530 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2a540 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2a550 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2a560 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2a570 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2a580 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2a590 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2a5a0 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2a5b0 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2a5c0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2a5d0 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2a5e0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2a5f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2a600 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2a610 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
2a620 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
2a630 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2a640 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
2a650 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2a660 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
2a670 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2a680 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2a690 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
2a6a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2a6b0 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2a6c0 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2a6d0 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
2a6e0 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
2a6f0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
2a700 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
2a710 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
2a720 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
2a730 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
2a740 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
2a750 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2a760 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
2a770 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
2a780 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
2a790 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
2a7a0 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
2a7b0 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
2a7c0 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
2a7d0 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
2a7e0 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
2a7f0 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
2a800 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
2a810 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
2a820 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
2a830 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
2a840 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
2a850 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
2a860 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
2a870 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
2a880 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
2a890 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
2a8a0 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
2a8b0 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
2a8c0 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
2a8d0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
2a8e0 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
2a8f0 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
2a900 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
2a910 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
2a920 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
2a930 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
2a940 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
2a950 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
2a960 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
2a970 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
2a980 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2a990 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
2a9a0 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
2a9b0 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
2a9c0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
2a9d0 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
2a9e0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
2a9f0 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
2aa00 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
2aa10 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
2aa20 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
2aa30 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
2aa40 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
2aa50 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
2aa60 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
2aa70 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
2aa80 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2aa90 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2aaa0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2aab0 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
2aac0 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
2aad0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
2aae0 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
2aaf0 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
2ab00 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
2ab10 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
2ab20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
2ab30 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
2ab40 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2ab50 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2ab60 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
2ab70 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2ab80 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
2ab90 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
2aba0 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
2abb0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
2abc0 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2abd0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2abe0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2abf0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
2ac00 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2ac10 20 72 65 74 75 72 6e 20 77 69 6e 47 65 74 4c 61   return winGetLa
2ac20 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
2ac30 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
2ac40 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  f, zBuf);.}../*.
2ac50 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
2ac60 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
2ac70 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
2ac80 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
2ac90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
2aca0 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
2acb0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
2acc0 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
2acd0 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2ace0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
2acf0 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
2ad00 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
2ad10 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2ad20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2ad30 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2ad40 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2ad50 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2ad60 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2ad70 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad90 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adb0 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2adc0 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2add0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
2ade0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
2adf0 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
2ae00 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2ae10 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2ae20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
2ae30 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
2ae40 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
2ae50 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
2ae60 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
2ae70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2ae80 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2ae90 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2aea0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2aeb0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2aec0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
2aed0 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
2aee0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
2aef0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2af00 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
2af10 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2af20 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
2af30 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2af40 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2af50 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2af60 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
2af70 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
2af80 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
2af90 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
2afa0 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
2afb0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
2afc0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2afd0 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2afe0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2aff0 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2b000 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2b010 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2b020 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
2b030 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
2b040 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
2b050 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
2b060 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66   */.  };.#if def
2b070 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2b080 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74  2_HAS_WIDE).  st
2b090 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2b0a0 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20   winLongPathVfs 
2b0b0 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0d0 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2b0e0 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2b0f0 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65       /* szOsFile
2b100 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57   */.    SQLITE_W
2b110 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59  INNT_MAX_PATH_BY
2b120 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61  TES, /* mxPathna
2b130 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b150 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2b160 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c  win32-longpath",
2b170 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2b180 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2b190 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
2b1a0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2b1b0 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2b1c0 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2b1d0 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2b1e0 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2b1f0 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2b200 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2b210 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2b220 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2b230 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2b240 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2b250 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2b260 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20   /* xDlOpen */. 
2b270 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20     winDlError,  
2b280 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2b290 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2b2a0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2b2b0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2b2c0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2b2d0 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2b2e0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2b2f0 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a  omness,       /*
2b300 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2b310 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2b320 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2b330 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2b340 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f  rentTime,      /
2b350 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2b360 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2b370 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47  Error,     /* xG
2b380 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2b390 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2b3a0 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72  eInt64, /* xCurr
2b3b0 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a  entTimeInt64 */.
2b3c0 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d      winSetSystem
2b3d0 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74  Call,    /* xSet
2b3e0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2b3f0 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2b400 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ll,    /* xGetSy
2b410 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2b420 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2b430 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73  l,   /* xNextSys
2b440 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2b450 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75  #endif..  /* Dou
2b460 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74  ble-check that t
2b470 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72  he aSyscall[] ar
2b480 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ray has been con
2b490 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f  structed.  ** co
2b4a0 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69  rrectly.  See ti
2b4b0 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30  cket [bb3a86e890
2b4c0 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73  c8e96ab] */.  as
2b4d0 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
2b4e0 61 53 79 73 63 61 6c 6c 29 3d 3d 37 37 20 29 3b  aSyscall)==77 );
2b4f0 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72  ..  /* get memor
2b500 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e  y map allocation
2b510 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a   granularity */.
2b520 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73    memset(&winSys
2b530 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Info, 0, sizeof(
2b540 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23  SYSTEM_INFO));.#
2b550 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2b560 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65  RT.  osGetNative
2b570 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
2b580 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  ysInfo);.#else. 
2b590 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
2b5a0 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
2b5b0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
2b5c0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
2b5d0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
2b5e0 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ty>0 );.  assert
2b5f0 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  ( winSysInfo.dwP
2b600 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20  ageSize>0 );..  
2b610 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
2b620 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29  ster(&winVfs, 1)
2b630 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ;..#if defined(S
2b640 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b650 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f  WIDE).  sqlite3_
2b660 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
2b670 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29  nLongPathVfs, 0)
2b680 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  ;.#endif..  retu
2b690 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2b6a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .int sqlite3_os_
2b6b0 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20 53  end(void){.#if S
2b6c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
2b6d0 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e   if( sleepObj!=N
2b6e0 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f  ULL ){.    osClo
2b6f0 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62  seHandle(sleepOb
2b700 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a  j);.    sleepObj
2b710 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e   = NULL;.  }.#en
2b720 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
2b730 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
2b740 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
2b750 49 4e 20 2a 2f 0a                                IN */.